← Назад к вопросам

Какие процессы запускают Job в Laravel?

2.0 Middle🔥 63 комментариев
#Фреймворки

Комментарии (3)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Процессы и способы запуска 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();

Факторы выбора способа запуска

  1. Требования к времени выполнения - синхронно vs асинхронно
  2. Масштабируемость - очереди позволяют горизонтальное масштабирование
  3. Надёжность - повторные попытки (retries) и failed jobs
  4. Приоритизация - разные очереди для разных типов задач
  5. Отслеживаемость - мониторинг через Horizon или кастомные решения

Каждый механизм запуска Jobs в Laravel предоставляет гибкость для построения эффективной фоновой обработки, соответствующей требованиям конкретного приложения от простых синхронных задач до сложных распределённых систем с приоритизацией и батчингом.