【问题标题】:Laravel Job Queue not processing using Redis driverLaravel 作业队列未使用 Redis 驱动程序处理
【发布时间】:2016-03-04 22:16:25
【问题描述】:

我正在创建一个作业,将其推送到自定义队列,并尝试使用 Redis 驱动程序在它到达队列时处理该作业,但没有成功:

class MyController extends Controller {
    public function method() {
        $job = (new UpdateLiveThreadJob())->onQueue('live');
        $this->dispatch($job);
    }
}

这是我的队列配置:

    'default' => env('QUEUE_DRIVER'),

    'redis' => [
        'driver' => 'redis',
        'connection' => 'default',
        'queue'  => 'default',
        'expire' => 60,
    ],

这是我的.env 文件:

# Drivers (Queues & Broadcasts)
CACHE_DRIVER=file
SESSION_DRIVER=file
QUEUE_DRIVER=redis
BROADCAST_DRIVER=redis

这是我的工作:

class UpdateLiveThreadJob extends Job implements SelfHandling, ShouldQueue
{
    /**
     * Create a new job instance.
     *
     * @return void
     */
    public function __construct()
    {
    }

    /**
     * Execute the job.
     *
     * @return void
     */
    public function handle()
    {
        // Rerender content
        $templatedOutput = view('templates.livethreadcontents')->with([
            'updates' => collect(Redis::lrange('live:updates', 0, -1))->reverse()->map(function($update) {
                return json_decode($update);
            })
        ])->render();

        // Connect to external service

        // Update Thread
    }
}

确实,我可以将 handle 方法更改为什么都不做,以确保它在工作中实际上没有导致它失败,并且它仍然没有处理:

    /**
     * Execute the job.
     *
     * @return void
     */
    public function handle()
    {
        print_r('test');
    }

使用 Redis,我可以看到它已被推入队列:

> lrange queues:live 0 -1
> // json encoded job present
> llen queues:live
> // shows there is a job in the queue

然而,据我所知,它从未真正触发过。观看php artisan queue:listen 什么也没有显示(只有不相关的事件广播)。这是怎么回事?

【问题讨论】:

    标签: php laravel redis publish-subscribe


    【解决方案1】:

    在 Laravel 5.3 中,队列发生了变化。现在您将运行php artisan queue:work --queue=live,这应该可以满足您的需要。

    我在下面留下了我原来的答案。


    你还记得运行php artisan queue:listen --queue=live 吗?

    你需要在运行listen命令时定义队列名称,否则你最终只能监听default队列。

    如果你想在生产环境中运行多个队列并管理事物,你可以使用 Upstart(与设置 Laravel 队列没有直接关系,但提供了一个很好的起点)或 Supervisor 之类的东西来管理进程。这两个都可以在 Forge 和 Homestead 上找到。

    最后假设您使用的是 Laravel 5,您可能需要考虑运行 php artisan queue:work --daemon --queue=live,因为这会减少运行 worker 的 CPU 开销,因为它不会为每个作业重新加载框架。但是当你为你的工作部署新代码时,你必须记住重启工作器,否则事情将不会被拾取。

    【讨论】:

    • 等等,真的吗?我不敢相信它这么简单!我从来没有被告知或展示过这一点,文档也没有暗示这一点。如何运行所有队列?我可以提供某种* 属性吗?
    • 不幸的是,据我所知,它只是一个队列侦听器,而不是侦听所有可用队列,实际上并没有一个 API 表明 Laravel 可以识别所有可能的队列。我刚刚为每个队列名称运行了一个工作器,然后我可以调整诸如重试之类的事情,以及基于每个队列执行的时间。
    • 刚刚添加了一些关于如何自动启动队列的注释,应该让它更容易一些。不是您正在寻找的通配符,但应该可以帮助您更接近。
    • 嗨 Marcus,所以我已将我的 supervisord 实例设置为运行:command=php /home/vagrant/myproj/artisan queue:work redis --queue=default,live,email,uploads --sleep=3 --tries=3 --daemon,但仍然只有 default 队列上的事件和作业正在运行,现在,作业应该继续 live 队列甚至没有排队(甚至比以前更没有帮助)。这是怎么回事?
    • @YassineMokni 感谢您的提醒。我已经有一段时间没有使用 Laravel 了。我已经为任何路人更新了我的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-29
    • 1970-01-01
    • 2016-09-26
    • 2017-09-07
    • 2020-07-01
    • 2021-05-02
    • 2019-01-02
    相关资源
    最近更新 更多