Управление очередями Laravel с помощью php artisan queue
Основные команды 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=3600Php 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 предоставляют гибкие инструменты для управления асинхронными заданиями. Правильное их использование значительно повышает отказоустойчивость и производительность приложения.