Проблема: долгие запросы
Представьте: пользователь загружает файл, а сервер парсит его 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 для любого серьёзного приложения. Пользователь получает мгновенный ответ, сервер не простаивает, а задачи обрабатываются надёжно с автоматическими повторами при ошибках.