Комментарии (3)
Ответ сгенерирован нейросетью и может содержать ошибки
Процессы и способы запуска Jobs в Laravel
В Laravel задачи (Jobs) могут запускаться несколькими ключевыми процессами и механизмами, каждый из которых служит определённым целям в архитектуре приложения.
Основные процессы запуска Jobs
1. Очереди (Queues) через воркеры
Самый распространённый способ - асинхронное выполнение через систему очередей:
// Диспетчеризация задачи в очередь
ProcessPodcast::dispatch($podcast)->onQueue('processing');
// Или с задержкой
SendEmail::dispatch($user)->delay(now()->addMinutes(10));
Воркеры очередей постоянно опрашивают очередь (Redis, database, SQS, Beanstalkd) на наличие новых задач:
# Запуск воркера для обработки очереди
php artisan queue:work --queue=high,default
# Воркер в режиме демона
php artisan queue:work --daemon
2. Синхронное выполнение (Synchronous Dispatch)
Для немедленного выполнения в текущем процессе:
// Синхронный запуск (без очереди)
ProcessImage::dispatchSync($image);
// Или через helper
dispatch_now(new ProcessOrder($order));
Это полезно для тестирования или когда требуется немедленное выполнение.
3. Команды Artisan
Jobs могут запускаться через команды Artisan как из CLI, так и программно:
// Запуск через Artisan команду
Artisan::call('queue:work --stop-when-empty');
// Создание кастомной команды, которая диспетчеризует Job
protected function handle() {
GenerateReport::dispatch($this->argument('date'));
}
4. Планировщик задач (Task Scheduling)
Через app/Console/Kernel.php можно настроить регулярный запуск Jobs:
// В методе schedule() Console\Kernel
protected function schedule(Schedule $schedule) {
// Ежедневный запуск в 3:00
$schedule->job(new CleanupOldRecords)->dailyAt('03:00');
// С указанием очереди
$schedule->job(new SyncWithExternalAPI, 'api', 'redis')->hourly();
}
5. События (Events) и слушатели (Listeners)
Jobs могут запускаться автоматически в ответ на события:
// В EventServiceProvider
protected $listen = [
OrderPlaced::class => [
SendOrderConfirmation::class, // Это может быть Job
UpdateInventory::class,
],
];
// Листенер, который диспетчеризует Job
class SendOrderConfirmation {
public function handle(OrderPlaced $event) {
SendConfirmationEmail::dispatch($event->order);
}
}
6. HTTP-запросы и контроллеры
Прямой запуск из контроллеров или middleware:
class OrderController extends Controller {
public function store(OrderRequest $request) {
$order = Order::create($request->validated());
// Запуск фоновой задачи
ProcessPayment::dispatch($order)->onQueue('payments');
return response()->json(['status' => 'processing']);
}
}
7. Консольные команды и скрипты
Запуск из кастомных скриптов или командной строки:
// В скрипте деплоя
$job = new BackupDatabase();
dispatch($job);
// Через фасад
Queue::push(new ProcessDataBatch($data));
8. Интеграция с Supervisor для production
В production окружении воркеры управляются через Supervisor для обеспечения надёжности:
; Конфигурация 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 --max-time=3600
autostart=true
autorestart=true
stopasgroup=true
killasgroup=true
numprocs=8
Ключевые механизмы диспетчеризации
dispatch()метод - основной способ помещения Job в очередьdispatchAfterResponse()- запуск после отправки HTTP-ответа клиенту- Цепочки задач (Job Chains) - последовательное выполнение Jobs:
ProcessPodcast::withChain([
new OptimizePodcast,
new PublishPodcast
])->dispatch($podcast);
- Батчинг (Batching) - групповое выполнение с отслеживанием прогресса:
Bus::batch([
new ImportContacts,
new AssignTeams,
new SendNotifications,
])->then(function (Batch $batch) {
// Все задачи завершены
})->dispatch();
Факторы выбора способа запуска
- Требования к времени выполнения - синхронно vs асинхронно
- Масштабируемость - очереди позволяют горизонтальное масштабирование
- Надёжность - повторные попытки (retries) и failed jobs
- Приоритизация - разные очереди для разных типов задач
- Отслеживаемость - мониторинг через Horizon или кастомные решения
Каждый механизм запуска Jobs в Laravel предоставляет гибкость для построения эффективной фоновой обработки, соответствующей требованиям конкретного приложения от простых синхронных задач до сложных распределённых систем с приоритизацией и батчингом.