2015-12-28 4 views
5

СитуацияПочему мои задания очереди Laravel не срабатывают через 60 секунд?

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

Я использую Supervisor для запуска моей очереди, и я запускаю 20 процессов за раз. Мой файл конфигурации супервизора выглядит следующим образом:

[program:duplitron-worker] 
process_name=%(program_name)s_%(process_num)02d 
command=php /var/www/duplitron/artisan queue:listen database --timeout=0 --memory=500 --tries=1 
autostart=true 
autorestart=true 
user=duplitron 
numprocs=20 
redirect_stderr=true 
stdout_logfile=/var/www/duplitron/storage/logs/duplitron-worker.log 

Есть несколько странностей, которые я не знаю, как объяснить или исправить:

  1. Мои работы достаточно последовательно терпят неудачу после запуска в течение 60 до 65 секунд ,
  2. После того, как помечается как сбой, задание продолжает работать даже после того, как оно помечается как сбой. В конце концов они действительно успешно решаются.
  3. Когда я run the failed task in isolation, чтобы найти причину проблемы, она преуспевает.

Я твердо верю, что это проблема с таймаутом; однако у меня создалось впечатление, что --timeout=0 приведет к неограниченному таймауту.

Вопрос

Как я могу предотвратить это временный «отказ» состояние задания? Существуют ли другие места, где может быть вызван тайм-аут очереди, о котором я не знаю?

+1

Проверьте 'max_execution_time' ваш php.ini Насколько это говорит? Если это 60 секунд, есть твоя проблема. попробуйте увеличить таймаут. –

+0

Отличная мысль @WillyPt - не будут ли настройки php.ini завершать весь скрипт? Он продолжает решать. (FWIW 'max_execution_time' был установлен на 30 секунд, я буду исследовать и экспериментировать по этим строкам). – slifty

ответ

10

Оказывается, что кроме тайм-аута есть expire настройка определяется в config/queue.php

'database' => [ 
     'driver' => 'database', 
     'table' => 'jobs', 
     'queue' => 'default', 
     'expire' => 60, 
    ], 

Изменение, что более высокое значение сделал трюк.

2

Важное примечание: "истекать" теперь называется "retry_after" (Laravel 5.4)

Смежные вопросы