У меня есть задание в очереди Laravel, которое извлекает ссылки с веб-страницы. Тайм-аут для прослушивателя очереди, настроенного через Laravel Forge, составляет 240 секунд (4 минуты). Однако выполнение заданий занимает до 45 минут.
Мои настройки очереди:
'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();
}
Обновление: еще одно простое задание выполняется без проблем, менее чем за секунду. В частности, работа ссылки выше занимает 10 секунд. Может быть проблема с оперативной памятью или что-то в этом роде? Что еще я могу сделать для диагностики проблемы? При запуске в составе консольного задания сама функция извлечения ссылок выполняется за 1 или 2 секунды. Это пугает только в очереди.