Управление очередями Laravel с помощью php artisan queue

Раздел: Laravel -> Очереди в Laravel

Основные команды php artisan queue

Наиболее эффективным решением для обработки заданий в production считается использование команды php artisan queue:work в сочетании с менеджером процессов (например, Supervisor). Она запускает постоянный воркер, который обрабатывает задания из очереди без перезагрузки при каждом задании.

php artisan queue:work --queue=high,default --tries=3 --timeout=120 --sleep=3 --max-jobs=100 --max-time=3600

Php artisan queue (команда php artisan queue)

Processing: App\Jobs\SendEmail
Processed:  App\Jobs\SendEmail

Пояснение параметров:

  • --queue=high,default - приоритетные очереди, сначала high, затем default.
  • --tries=3 - количество попыток выполнения задания до помещения в failed.
  • --timeout=120 - максимальное время выполнения задания (сек).
  • --sleep=3 - пауза между проверками очереди (сек).
  • --max-jobs=100 - количество заданий до остановки воркера (для освобождения памяти).
  • --max-time=3600 - время жизни воркера (сек) до перезапуска.

Типичные проблемы: воркер останавливается из-за превышения лимита памяти. Решение - указать --memory или чаще перезапускать через --max-jobs. Также возможна блокировка очереди при неправильном использовании блокировок (например, в PostgreSQL с FOR UPDATE SKIP LOCKED требует правильного драйвера).

Как автоматически перезагружать воркер при изменении кода?

Используется команда php artisan queue:listen. Она запускает воркер, который перезапускается после каждого задания. Это удобно на этапе разработки, когда код часто меняется.

php artisan queue:listen --queue=default --timeout=60
[2025-04-06 10:00:00] Processing: App\Jobs\ProcessPodcast
[2025-04-06 10:00:02] Processed:  App\Jobs\ProcessPodcast

Отличия от work: listen перезагружает воркер после каждого задания, что снижает производительность в production. Подходит для разработки. Параметры --tries, --sleep также работают.

Распространенная ошибка: использование listen в production приводит к высокой нагрузке на процессор и медленной обработке. Рекомендуется переключиться на work с Supervisor.

Как обработать только одно задание из очереди?

Параметр --once с командой work позволяет выполнить одно задание и завершиться. Используется, например, в cron-задачах.

php artisan queue:work --once
Processing: App\Jobs\SendEmail
Processed:  App\Jobs\SendEmail

После обработки воркер завершает работу. Можно комбинировать с --queue и --tries.

Как корректно перезапустить все запущенные воркеры после обновления кода?

Команда php artisan queue:restart отправляет сигнал всем активным воркерам о необходимости перезапуска после завершения текущего задания. Сами воркеры (work) получают этот сигнал и аккуратно завершаются, затем перезапускаются Supervisor'ом.

php artisan queue:restart
Broadcasting queue restart signal.

Важно: команда не выводит список работающих воркеров. Она использует кэш Laravel для передачи сигнала. Убедитесь, что кэш доступен (драйвер file, redis, memcached).

Проблема: если используется драйвер кэша null, сигнал не будет отправлен. Решение - использовать file или redis.

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

Команда php artisan queue:failed выводит таблицу проваленных заданий из базы данных (таблица failed_jobs). Перед этим необходимо выполнить миграцию php artisan queue:failed-table и запустить php artisan migrate.

php artisan queue:failed
+----+------------+---------+---------------------+
| ID | Connection | Queue   | Failed at           |
+----+------------+---------+---------------------+
| 1  | database   | default | 2025-04-06 10:05:00 |
| 2  | redis      | high    | 2025-04-06 10:06:00 |
+----+------------+---------+---------------------+

Для просмотра подробностей о конкретном задании можно указать ID: php artisan queue:failed --id=1 (но опция --id существует только в более новых версиях, обычно выводятся все записи).

Как повторно попытаться выполнить проваленные задания?

Используется php artisan queue:retry. Можно указать конкретный ID или all для всех заданий.

php artisan queue:retry all
1 jobs have been requeued.

Также: php artisan queue:retry 3 5 - повтор для заданий с ID 3 и 5.

Ошибка: если задание уже удалено из failed_jobs, команда выдаст предупреждение. Нужно убедиться, что записи существуют.

Как очистить таблицу проваленных заданий?

Команда php artisan queue:flush удаляет все записи из таблицы failed_jobs.

php artisan queue:flush
Flushed all failed jobs.

Используется после того, как неактуальные проваленные задания были проанализированы и больше не нужны.

Как отслеживать количество заданий в очередях?

Команда php artisan queue:monitor позволяет установить пороговые значения для очередей и получать предупреждения, если количество ожидающих заданий превышает лимит. Она выводит список очередей с количеством заданий.

php artisan queue:monitor redis:default,redis:high --max=10
[redis:default] 5 jobs.
[redis:high] 12 jobs (exceeds max of 10).

Может использоваться в скриптах мониторинга или cron для отправки уведомлений.

Расширенные примеры использования команд очередей

Пример 1: Настройка Supervisor для queue:work

Создайте конфигурационный файл /etc/supervisor/conf.d/laravel-worker.conf:

Пример
[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /var/www/html/artisan queue:work --sleep=3 --tries=3 --max-jobs=50 --max-time=3600
autostart=true
autorestart=true
stopasgroup=true
killasgroup=true
user=forge
numprocs=4
redirect_stderr=true
stdout_logfile=/var/www/html/storage/logs/worker.log
После перезапуска Supervisor (supervisorctl update && supervisorctl start laravel-worker:*) 4 воркера запустятся и будут обрабатывать задания. Каждый воркер завершится после 50 заданий или 1 часа, что предотвратит утечку памяти.

Пример 2: Обработка заданий с высоким приоритетом

Пример
php artisan queue:work --queue=critical,high,default --tries=5 --timeout=300 --sleep=1 --max-jobs=20
Воркер сначала обрабатывает очередь critical, затем high, затем default. Любое задание повторяется до 5 раз при неудаче. Время ожидания между проверками очереди - 1 секунда для уменьшения задержки.

Пример 3: Использование queue:retry с условиями

Пример
php artisan queue:retry all --force
Параметр --force (необязательный) подавляет запрос подтверждения. Рекомендуется только в автоматизированных скриптах.

Пример 4: Создание дампа проваленных заданий в файл

Пример
php artisan queue:failed --json > failed_jobs.json
Команда выводит список проваленных заданий в JSON-формате, который можно перенаправить в файл для анализа или резервного копирования.

Пример 5: Мониторинг очередей с отправкой уведомления

Пример
# В crontab (каждые 5 минут):
*/5 * * * * php artisan queue:monitor redis:default --max=50 2>&1 | mail -s 'Queue Alert' admin@example.com
Если в очереди redis:default больше 50 заданий, выводится сообщение, которое отправляется на почту.

Пример 6: Очистка очереди (для драйвера database)

Пример
php artisan queue:clear --queue=default --force
Удаляет все задания из указанной очереди. Осторожно: операция необратима! Используется только на тестовых средах.

Пример 7: Запуск воркера с пользовательским временем ожидания

Пример
php artisan queue:work --sleep=60 --tries=1 --timeout=0
Воркер проверяет очередь раз в минуту, выполняет задание только один раз (без повторных попыток) и не ограничивает время выполнения (timeout=0). Подходит для фоновых задач, которые не должны повторяться.

Команды очередей Laravel предоставляют гибкие инструменты для управления асинхронными заданиями. Правильное их использование значительно повышает отказоустойчивость и производительность приложения.

Команда php artisan queue - comments

En
Php artisan queue (php)