Я изучаю Laravel Framework и сталкиваюсь с некоторыми проблемами с очередями. 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
,
Других решений пока нет …