【问题标题】:Laravel queue (regardless of driver) processes a job only after the next is queuedLaravel 队列(无论驱动程序如何)仅在下一个排队后才处理作业
【发布时间】: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

&gt;&gt;&gt; App\Jobs\TestQueue::dispatch(1)

日志:

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

&gt;&gt;&gt; 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

&gt;&gt;&gt; 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 提交了一个错误。我们会看看这是否是报告它的合适地方。请发表您的评论作为答案,以便我接受。

标签: laravel laravel-5 queue


【解决方案1】:

正如评论中提到的,我认为这只是使用 tinker 而不是 Web 界面的产物。 我也可以用 tinker 重现这个,但不能在 Web 请求上下文中重现。

我不确定为什么会发生这种情况,虽然 tinker 对于调试目的非常有帮助,但它可能无法完全处理排队等操作。

您可以向 Laravel 提交错误,也可以直接在 Laravel 修补程序项目中提交,地址为 https://github.com/laravel/tinker

【讨论】:

  • 我知道这是旧的,但会留给其他人 - 我在 tinker 的自述文件的“调度工作”中记录了它,请参阅此处:github.com/laravel/tinker
猜你喜欢
  • 2016-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-20
  • 1970-01-01
  • 2015-11-03
  • 1970-01-01
  • 2019-01-02
相关资源
最近更新 更多