Я изучаю структуру Laravel и сталкиваюсь с некоторыми проблемами с очередями. Laravel предоставляет унифицированный API для работы с очередями, и я изучаю его. Одним из методов, который предоставляет Laravel, является Queue::later(DateTime|int $delay, string $job, mixed $data = '', string $queue = null);
Итак, я реализовал свой класс работы:
<?php class SendEmail { public function send($job, $data) { Log::info('JOB: ' . $job->getName()); Log::info('DATA: ' . $data['message']); } }
Выше, я регистрирую файл, полученные параметры. Просто знать, работает ли это или нет. Мой контроллер вызывает это задание с помощью Queue API:
<?php class MyControllerController extends BaseController { function index() { LOG::debug('Index action STARTED'); $date = Carbon::now()->addMinutes(2); Queue::later($date, 'SendEmail@send', array('message' => 'MY MESSAGE!')); $view = View::make('index'); LOG::debug('Index action FINISHED'); return $view; } }
Посмотрите, что я использую Queue::later()
. Я ожидал, что метод send()
класса SendEmail
будет выполнен через 2 минуты. Ну, я закончил реализацию пустого представления и установил маршрут. Затем я сделал запрос GET моему контроллеру, и я пошел проверять файл журнала.
Я видел это, когда открыл файл журнала:
[2014-10-02 16:23:11] production.DEBUG: Index action STARTED [] [] [2014-10-02 16:23:11] production.INFO: JOB: [] [] [2014-10-02 16:23:11] production.INFO: DATA: MY MESSAGE! [] [] [2014-10-02 16:23:11] production.DEBUG: Index action FINISHED [] []
Все выполнено в одно и то же время, включая работу. Queue::later()
не задерживает выполнение. Я думаю, что мой файл журнала должен быть:
[2014-10-02 16:23:11] production.DEBUG: Index action STARTED [] [] [2014-10-02 16:23:11] production.DEBUG: Index action FINISHED [] [] [2014-10-02 16:25:11] production.INFO: JOB: [] [] [2014-10-02 16:25:11] production.INFO: DATA: MY MESSAGE! [] []
Что случилось с моим кодом?
Извините, я только что нашел свою ошибку. Я использую драйвер sync
, что означает, что задание выполняется при создании задания. Я открыл /app/config/queue.php
и нашел:
'sync' => array( 'driver' => 'sync', ),
Я попробую с beanstalkd
.