Laravel - Обрабатывать метод для задания, все еще находящегося в памяти после завершения - PullRequest
0 голосов
/ 24 апреля 2020

У меня есть работа в моем приложении, которая используется для выполнения некоторых операций с файлом (копирование, замена тегов в текстовом документе, преобразование в pdf, zip-файлы и т. Д. c ...). В зависимости от размера файла процессу может потребоваться различное количество секунд, поэтому в первой строке метода handle я добавил

ini_set('max_execution_time', 14000);

Просто, чтобы избежать ошибок тайм-аута. Проблема заключается в том, что, несмотря на то, что код структурирован с помощью последовательности try-catch, поэтому задание не может завершиться неудачей, процесс, похоже, все еще находится в памяти и не закрыт, даже с возвратом в последней строке кода. На самом деле иногда это исключение появляется в моем файле журнала.

Maximum execution time of 14000 seconds exceeded {"exception":"[object] (Symfony\\Component\\Debug\\Exception\\FatalErrorException(code: 1): Maximum execution time of 14000 seconds exceeded at ...\\vendor\\laravel\\framework\\src\\Illuminate\\Queue\\Worker.php:606)

Как я могу исправить эту проблему? Большое спасибо

1 Ответ

0 голосов
/ 24 апреля 2020

Это исключение для работника очереди. Работник очереди - это задача, которая всегда выполняется и проверяет очередь на наличие новых заданий для обработки. По умолчанию максимальное время выполнения CLI (в котором работает работник очереди) бесконечно и по уважительной причине.

«Правильный» способ обеспечить хороший тайм-аут для ваших заданий - предоставить хорошую конфигурацию для работника очереди. Существует два отдельных параметра, которые вы должны использовать в сочетании друг с другом: retry_after, который настроен в вашем config/queue.php, и параметр --timeout=X задачи рабочего процесса очереди.

То, как вы будете использовать это:

  1. Установите разумный тайм-аут для вашего работника очереди, запустив, например, php artisan queue:work --timeout=14000
  2. Определите время, в которое Очередь, которая ранее была неудачной, должна быть повторена, например retry_after => 14060 (одна минута спустя)

Это задокументировано в Истечениях и тайм-аутах заданий

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

...