Laravel队列(与驱动程序无关)仅在下一个作业排队后才处理该作业



答案:我对Tinker文档的补丁现在已经成为Laravel的官方文档,请参阅此处的警告框:https://laravel.com/docs/6.x/artisan#tinker


昨天我注意到这种非常奇怪的Laravel队列行为,队列总是等待下一个作业被调度来处理之前调度的作业。请帮我了解发生了什么。

$ laravel new test
$ cd test
$ php artisan make:job TestQueue

将以下内容粘贴到TestQueue类中。没有什么花哨的,真的:

<?php
namespace AppJobs;
use IlluminateBusQueueable;
use IlluminateSupportFacadesLog;
use IlluminateQueueSerializesModels;
use IlluminateQueueInteractsWithQueue;
use IlluminateContractsQueueShouldQueue;
use IlluminateFoundationBusDispatchable;
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环境变量(redisbeanstalkd甚至sync!(如何,我都会得到以下行为:

请注意,我在一个单独的终端中运行php artisan queue:work

$ php artisan tinker

>>> AppJobsTestQueue::dispatch(1)

日志:

[2018-10-30 22:38:01] local.INFO: Creating 1

>>> AppJobsTestQueue::dispatch(2)

日志:

[2018-10-30 22:38:04] local.INFO: Creating 2
[2018-10-30 22:38:06] local.INFO: Running 1

>>> AppJobsTestQueue::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

编辑:本地环境,配置未缓存

正如评论中提到的,我认为这只是使用修补程序而不是web界面的产物。我也可以用修补程序来复制这一点,但在网络请求上下文中不能复制。

我不知道为什么会发生这种情况,虽然修补程序对调试很有帮助,但它可能无法完全处理排队等操作。

你可以向Laravel提交一个bug,也可以直接在Laravel修补程序项目中https://github.com/laravel/tinker

最新更新