昨天,我注意到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环境(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
编辑:本地环境,未缓存配置
答案 0 :(得分:1)
如评论中所述,我认为这只是使用修补程序而不是Web界面的人工产物。 我也可以使用修补程序来重现此内容,但是在Web请求上下文中执行此操作时则不能。
我不确定为什么会发生这种情况,尽管修补程序对于调试非常有用,但它可能无法完全处理排队等操作。
您可以向Laravel提交错误,也可以直接在https://github.com/laravel/tinker的Laravel Tinker项目中提交错误