Подтвердить что ты не робот

Catching ProcessTimedOutException в очереди мастеров Laravel: слушать

У нас есть куча заданий SQS, которые мы наблюдаем и обрабатываем с использованием Laravel php artisan queue:listen.

Периодически происходит несколько минут, и SQS истекает время. Когда это произойдет, queue:listen прерывается с сообщением типа:

[Symfony\Component\Process\Exception\ProcessTimedOutException]                                                                                             
  The process "php artisan queue:work
    --queue="https://sqs.us-west-2.amazonaws.com/*******/queue"
    --delay=0 --memory=128 --sleep=3 --tries=0 -env=production"
  exceeded the timeout of 60 seconds.

Я пробовал обработать исключение в app/start/global.php и, альтернативно, app/start/artisan.php:

App::error(function(Symfony\Component\Process\Exception\ProcessTimedOutException $exception) {
    // do nothing
});

К сожалению, исключение все еще происходит, и мой queue:listen все еще умирает.

Как я могу поймать это исключение и игнорировать его для повтора?

4b9b3361

Ответ 1

Вы повторно запустили задачу очереди "php artisan queue: work..." в обработчике исключений,

или увеличить /vendor/symfony/process/Symfony/Component/Process/Process:: значение setTimeout() для чего-то более высокого.

Или, возможно, оба.

Ответ 2

Не ответ, но больше похоже на обходное решение:

Всякий раз, когда мне нужно убедиться, что процесс будет работать даже при возникновении ошибки, я использую npms forever. Этот удобный инструмент перезапустит процесс, как только он сработает.

Установка довольно проста:

sudo apt-get install nodejs
sudo apt-get install npm
sudo ln -s /usr/bin/nodejs /usr/bin/node
sudo npm -g install forever

Используйте эту команду для запуска процесса: forever start -c php artisan queue:listen
Если вам нужно остановить его: forever stopall

Ответ 3

Если это помогает, я использую SupervisorD для запуска клонов, и у меня есть этот огонь из очереди: работайте каждую секунду, у меня нет проблем с SQS.

Ответ 4

Время ожидания будет время от времени. Класс Symfony Process имеет собственные настройки таймаута, которые вызывают этот определенный тайм-аут (я считаю). Я не уверен, что вы можете поймать это без редактирования основного кода Laravel, относящегося к работнику, что не очень хорошая идея.

Я бы настоятельно рекомендовал использовать супервизор, как показано в документах Laravel:

https://laravel.com/docs/5.1/queues#supervisor-configuration

Это автоматически перезагрузит ваш слушатель, даже если он не работает.