← Назад к блогу
Блог

Laravel Queues + Redis: от нуля до продакшена

Проблема: долгие запросы

Представьте: пользователь загружает файл, а сервер парсит его 30 секунд. Браузер крутит спиннер, пользователь злится. Решение — очереди. Переносим тяжёлую работу в фон, отвечаем пользователю мгновенно.

Настраиваем Redis

Redis — идеальный драйвер для очередей: быстрый, персистентный, с мониторингом.

# .env
QUEUE_CONNECTION=redis

# Устанавливаем Redis
sudo apt install redis-server
composer require predis/predis

Создаём Job

php artisan make:job ProcessImportFile

В job-классе прописываем логику:

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

    public function __construct(
        private readonly string $filePath,
        private readonly int $userId
    ) {}

    public function handle(): void
    {
        $data = $this->parseFile($this->filePath);
        
        foreach ($data as $row) {
            Product::updateOrCreate(
                ['sku' => $row['sku']],
                ['name' => $row['name'], 'price' => $row['price']]
            );
        }
        
        // Уведомляем пользователя
        User::find($this->userId)->notify(new ImportCompleted(count($data)));
    }
}

Диспатчим задачу

public function upload(Request $request)
{
    $path = $request->file('import')->store('imports');
    
    ProcessImportFile::dispatch($path, auth()->id());
    
    return back()->with('status', 'Файл загружен! Обработка в фоне.');
}

Запускаем воркер

php artisan queue:work redis --tries=3 --max-time=3600

Для продакшена используем Supervisor, чтобы воркер перезапускался при падении:

[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /var/www/app/artisan queue:work redis --sleep=3 --tries=3
autostart=true
autorestart=true
numprocs=2

Мониторинг

Laravel Horizon — веб-интерфейс для мониторинга очередей:

composer require laravel/horizon
php artisan horizon:install

Открываем /horizon и видим: количество задач, время выполнения, ошибки, проваленные задачи.

Итог

Очерди — must-have для любого серьёзного приложения. Пользователь получает мгновенный ответ, сервер не простаивает, а задачи обрабатываются надёжно с автоматическими повторами при ошибках.