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

时间:2018-10-31 08:39:11

标签: laravel laravel-5 queue

昨天,我注意到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环境(redisbeanstalkd甚至 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

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

1 个答案:

答案 0 :(得分:1)

如评论中所述,我认为这只是使用修补程序而不是Web界面的人工产物。 我也可以使用修补程序来重现此内容,但是在Web请求上下文中执行此操作时则不能。

我不确定为什么会发生这种情况,尽管修补程序对于调试非常有用,但它可能无法完全处理排队等操作。

您可以向Laravel提交错误,也可以直接在https://github.com/laravel/tinker的Laravel Tinker项目中提交错误