Ответ 1
Вы повторно запустили задачу очереди "php artisan queue: work..." в обработчике исключений,
или увеличить /vendor/symfony/process/Symfony/Component/Process/Process:: значение setTimeout() для чего-то более высокого.
Или, возможно, оба.
У нас есть куча заданий 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
все еще умирает.
Как я могу поймать это исключение и игнорировать его для повтора?
Вы повторно запустили задачу очереди "php artisan queue: work..." в обработчике исключений,
или увеличить /vendor/symfony/process/Symfony/Component/Process/Process:: значение setTimeout() для чего-то более высокого.
Или, возможно, оба.
Не ответ, но больше похоже на обходное решение:
Всякий раз, когда мне нужно убедиться, что процесс будет работать даже при возникновении ошибки, я использую 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
Если это помогает, я использую SupervisorD для запуска клонов, и у меня есть этот огонь из очереди: работайте каждую секунду, у меня нет проблем с SQS.
Время ожидания будет время от времени. Класс Symfony Process имеет собственные настройки таймаута, которые вызывают этот определенный тайм-аут (я считаю). Я не уверен, что вы можете поймать это без редактирования основного кода Laravel, относящегося к работнику, что не очень хорошая идея.
Я бы настоятельно рекомендовал использовать супервизор, как показано в документах Laravel:
https://laravel.com/docs/5.1/queues#supervisor-configuration
Это автоматически перезагрузит ваш слушатель, даже если он не работает.