2017-02-02 7 views
2

У меня есть работа в очереди Laravel, которая извлекает ссылки с веб-страницы. Тайм-аут для слушателя очереди, настроенного через Laravel Forge, составляет 240 секунд (4 минуты). Однако рабочие места занимают до 45 минут для запуска.Laravel Queued Jobs Работает на многие минуты дольше, чем таймаут

Мои настройки очереди:

'redis' => [ 
    'driver' => 'redis', 
    'connection' => 'default', 
    'queue' => 'default', 
    'retry_after' => 350, 
], 

И Есть несколько процессов, выполняющихся работа - до 35 процессов. Как вы можете себе представить, это много памяти сервера. Процессы, похоже, висят вокруг. Команда для этих процессов, как показано в top является:

php7.1 artisan queue:work redis --once --queue=linkqueue --delay=0 --memory=128 --sleep=10 --tries=1 --env=local 

Как работа в течение 45 минут, если тайм-аут составляет 240 секунд? Почему так много процессов - разве не должно быть только одного?

Кроме того, любые идеи, почему сценарий для извлечения ссылок должен занимать 45 минут?

Сценарий Работа, то есть в большинстве случаев он работает, как ожидалось, - это просто требует возраста. Насколько мне известно, ошибок не сообщалось/регистрировалось.

Код в работе является:

$dom = new DOMDocument; 
$dom->loadHTML($html); 
$links = $dom->getElementsByTagName('a'); 

foreach ($links as $a) { 
    $link = $a->getAttribute('href'); 

    $newurl = new URL; 
    $newurl->url = $link; 
    $newurl->save(); 
} 

Update: Еще одна простая работа работает просто отлично, в течение секунды. Это определенно только работа над ссылками, которая занимает 10 секунд. Это может быть проблема с ОЗУ или что-то еще? Есть ли что-нибудь еще, что я могу сделать, чтобы диагностировать проблему? Когда он запускается как часть задания на консоль, сама функция extract links работает через 1 или 2 секунды. Только в очереди, что он волнуется.

+0

Вы пытались запустить сценарий вручную и проверить, сколько времени потребуется? :) – Troyer

+0

@Troyer Да, извините, должно быть, упомянул об этом - я не могу заставить его занять более 1 или 2 секунды, когда закончится очередь. Это очень быстро. Это похоже на то, что скрипт заблокирован/висит при постановке в очередь. Это не займет ни минуты около 45 минут! – samiles

ответ

2

Как выполнить задание на 45 минут, если таймаут составляет 240 секунд?

Поскольку у вас есть 'retry_after' => 350, в вашей очереди. Это означает, что если Laravel не будет слышать из задания после 350 секунд - он предполагает, что задание завершилось неудачей и снова повторится. Это приводит к нескольким процессам одной работы в вашей ситуации.

Если вы счастливы разрешить свои рабочие места работать до 45 минут - тогда вы должны установить retry_after больше. Скажите 3600, который составляет 1 час.

Таким образом, работа запускается только в том случае, если требуется больше 1 часа для запуска.

-1

Вы также можете сделать следующее, чтобы неограниченное количество тайм-аутов.

php artisan queue:listen --timeout=0 
Смежные вопросы