Вчера я заметил это действительно странное поведение очереди Laravel, когда очередь всегда ожидает запланированного задания NEXT для обработки ранее запланированного задания. Пожалуйста, помогите мне понять, что происходит.
$ laravel new test
$ cd test
$ php artisan make:job TestQueue
Вставьте следующее в класс TestQueue. Ничего особенного, на самом деле:
<?php
namespace App\Jobs;
use Illuminate\Bus\Queueable;
use Illuminate\Support\Facades\Log;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
class TestQueue implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
public $id;
/**
* Create a new job instance.
*
* @return void
*/
public function __construct($id)
{
Log::info('Creating ' . $id);
$this->id = $id;
}
/**
* Execute the job.
*
* @return void
*/
public function handle()
{
Log::info('Running ' . $this->id);
}
}
Теперь, независимо от QUEUE_CONNECTION env var (redis
, beanstalkd
, даже sync
!), Я получаю следующее поведение:
Обратите внимание: у меня php artisan queue:work
работает в отдельном терминале.
$ php artisan tinker
>>> App\Jobs\TestQueue::dispatch(1)
журналы:
[2018-10-30 22:38:01] local.INFO: Creating 1
>>> App\Jobs\TestQueue::dispatch(2)
журналы:
[2018-10-30 22:38:04] local.INFO: Creating 2
[2018-10-30 22:38:06] local.INFO: Running 1
>>> App\Jobs\TestQueue::dispatch(3)
журналы:
[2018-10-30 22:38:22] local.INFO: Creating 3
[2018-10-30 22:38:24] local.INFO: Running 2
Я считаю, что не только очередь, независимо от драйвера, должна забирать первое задание и обрабатывать его всякий раз, когда очередь готова, но драйвер синхронизации должен немедленно обрабатывать каждое задание в очереди (вызывая его метод handle()
).
Мне кажется, что кто-то пытается доказать мне 1 + 1 = 3, и я просто не вижу, что я делаю неправильно. Я уверен, что это не ошибка в фреймворке, потому что об этом бредит интернет, а это не так.
Спасибо за ваше время.
Laravel Framework 5.7.12
Редактировать: локальная среда, конфигурация не кэшируется