#php #laravel #laravel-horizon
#php #ларавель #laravel-horizon #laravel
Вопрос:
Я отправляю задания для выполнения некоторой работы в моей очереди horizon. Похоже, что одни и те же задания всегда завершаются с ошибкой во время выполнения 60, что для меня выглядит как проблема с таймаутом:
Я отправляю около 10 заданий по расписанию cron, и эти 4 всегда терпят неудачу.
Это мое config/horizon.php
(только самое интересное):
<?php
use IlluminateSupportStr;
return [
'waits' => [
'redis:default' => 60,
],
'memory_limit' => 512,
'defaults' => [
'my-app-queue' => [
'connection' => 'redis',
'queue' => ['default'],
'balance' => 'auto',
'minProcesses' => 1,
'maxProcesses' => 1,
'balanceMaxShift' => 1,
'balanceCooldown' => 3,
'memory' => 512,
'tries' => 3,
'nice' => 0,
'timeout' => 300,
],
],
'environments' => [
'production' => [
'my-app-queue' => [
'maxProcesses' => 10,
],
],
'local' => [
'my-app-queue' => [
'maxProcesses' => 10,
],
],
],
];
Как вы можете видеть, я установил тайм-аут в 300 секунд, но задание всегда завершается неудачей на отметке 60 секунд.
Я запускаю обработчик очереди horizon в моем контейнере docker с помощью этой команды entrypoint: php /path/to/artisan horizon
Чтобы устранить проблему, я создал экземпляр класса job вручную, чтобы увидеть, где он терпит неудачу, например:
$test = new DownloadBlockedIPFeed(8);
$test->handle();
exit('Done');
Это, кажется, занимает больше времени, чем 60 секунд, но оно завершается.
Итак, мой вопрос — как правильно установить время ожидания для laravel horizon?
Я использую laravel 8.x и последнюю версию пакета horizon.
Комментарии:
1. Похоже, что это тайм-аут PHP, а не конфигурация horizon.
2. разве php-cli не имеет
max_execution_time
значения-1
? задания должны выполняться в cli и не наследовать никаких ограничений по времени выполнения. я перепроверю, просто чтобы быть уверенным.3. Взгляните на laravel.com/docs/8.x/queues#job-expirations-and-timeouts попробуйте также добавить a
retry_after
со значением 3004. Если в ваших классах заданий задан тайм-аут, они имеют приоритет над заданным по умолчанию Horizon, независимо от того, больше или меньше тайм-аут класса по умолчанию Horizon.
5. @Latheesan Вы нашли решение для этого?
Ответ №1:
Это также может быть стратегия баланса. Я обнаружил, что если я установлю для параметра «баланс» значение «авто», это приведет к ошибкам MaxAttemptsExceededException. похоже, решение состоит в том, чтобы изменить его на «простой» или «ложный».
Не уверен, что это ошибка, но я не думаю, что это ожидаемое поведение. Я видел задания, которые выполнялись (вход в метод дескриптора задания), но завершались в середине для повторной попытки.
Ответ №2:
Проверьте значение для --timeout=
в порожденном horizon:supervisor
процессе. Если это 60 секунд, измените timeout
значение в config/horizon.php
.
Также проверьте retry_after
config/queue.php
.