【发布时间】:2018-10-31 08:39:10
【问题描述】:
Answer:我的 Tinker 文档补丁现在已发布到 Laravel 官方文档中,请参阅此处的警告框: https://laravel.com/docs/6.x/artisan#tinker
昨天我注意到这个非常奇怪的 Laravel 队列行为,队列总是等待下一个作业被安排来处理之前安排的作业。请帮助我了解发生了什么。
$ 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、even 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
编辑:本地环境,配置未缓存
【问题讨论】:
-
我认为这只是使用 tinker 而不是 Web 界面的产物。我也可以用 tinker 来重现这个,但在 Web 请求上下文中这样做时不行
-
@apokryfos 天哪,这太奇怪了,你是对的!非常感谢。至少在 redis 的情况下......您能否验证同步驱动程序是否同时记录了创建和运行?我也检查了同步,但仍然失败,但更糟。它只是继续接受(创建 x 个已记录的)作业,但从未在它们上调用
handle()。编辑:忽略这一点,我将同步驱动程序配置为 null(不确定这是默认的 laravel 模板还是我更改了它)。无论如何,请粘贴您的评论作为答案,@apokryfos :)。我会提交一个错误。 -
@apokryfos 我在laravel/framework 提交了一个错误。我们会看看这是否是报告它的合适地方。请发表您的评论作为答案,以便我接受。