Как настроить очередь задач в Laravel?php-83

Очереди в Laravel позволяют откладывать трудоемкие задачи (например, отправку email или обработку файлов) для асинхронного выполнения. Вот подробное руководство по настройке:

1. Конфигурация подключения

Сначала настройте подключение в config/queue.php. Laravel поддерживает несколько драйверов:

'connections' => [
    'database' => [
        'driver' => 'database',
        'table' => 'jobs',
        'queue' => 'default',
        'retry_after' => 90,
    ],
    'redis' => [
        'driver' => 'redis',
        'connection' => 'default',
        'queue' => '{default}',
        'retry_after' => 90,
        'block_for' => null,
    ],
],

2. Создание таблиц для очереди

php artisan queue:table
php artisan migrate

3. Создание задачи

Создайте класс задачи командой:

php artisan make:job ProcessPodcast

Пример класса Job:

namespace App\Jobs;

use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;

class ProcessPodcast implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    public function __construct(public Podcast $podcast) {}

    public function handle(): void
    {
        // Логика обработки подкаста
    }
}

4. Запуск очереди

Для обработки задач запустите воркер:

php artisan queue:work

Полезные опции:

  • --queue=high,default - приоритеты очередей
  • --tries=3 - количество попыток
  • --timeout=30 - таймаут выполнения

5. Супервизор для production

Для надежной работы на production используйте Supervisor. Пример конфига (/etc/supervisor/conf.d/laravel-worker.conf):

[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /var/www/artisan queue:work --sleep=3 --tries=3
autostart=true
autorestart=true
user=www-data
numprocs=8
redirect_stderr=true
stdout_logfile=/var/www/worker.log

6. Отправка задач в очередь

ProcessPodcast::dispatch($podcast);
// Или с задержкой
ProcessPodcast::dispatch($podcast)->delay(now()->addMinutes(10));

7. Обработка неудачных задач

Создайте таблицу для неудачных задач:

php artisan queue:failed-table
php artisan migrate

Просмотр неудачных задач:

php artisan queue:failed

8. Horizon

Для продвинутого мониторинга установите Horizon:

composer require laravel/horizon
php artisan horizon:install

Резюмируем:

Laravel предоставляет мощную систему очередей с поддержкой различных драйверов (database, redis, sqs и др.), возможностью повторения неудачных задач и инструментами для мониторинга. На production важно использовать Supervisor или Horizon для стабильной работы воркеров.