【问题标题】:How to force laravel to wait until the end job?如何强制laravel等到结束工作?
【发布时间】:2019-07-08 14:07:10
【问题描述】:

我在控制器中的函数调用并行,我在 laravel 中创建了一个使用队列的作业,因为并行调用导致了问题

我创建队列如下:

public function serve($id)
{
    $this->dispatch(new OrderServeJob($id));
    return response()->json(true);
}

然后我跑:

php artisan queue:work

但是我对这个方法有问题

我希望 laravel 等到队列结束,然后返回 response()->json(true)

然后将用户重定向到另一个地址

【问题讨论】:

    标签: php laravel queue jobs


    【解决方案1】:

    如果您希望在通话结束前处理您的工作,您应该为您的工作使用syncdriver。您可以自定义作业连接以在您的作业中使用:

    class OrderServeJob implements ShouldQueue {
    
        public $connection = 'sync'; // <---
    
    
        //
    
    }
    

    您可以在config/queue.php 文件中查看此(和其他)队列配置:

    'connections' => [
    
        'sync' => [
            'driver' => 'sync',
        ],
    
        //
    
    ]
    

    查看文档的Customizing The Queue & Connection 部分。

    【讨论】:

    • 如果他将队列驱动程序更改为 redis,这将不再起作用,例如然后他返回响应,但甚至不知道作业是失败还是成功
    • 这就是为什么我建议他使用同步驱动程序。同步驱动程序与同步运行代码相同。如果他使用任何其他驱动程序,则作业将排队,因此,正如您所说,只要作业成功排队,它就会返回。
    • 请注意,此配置仅影响此特定作业,而不影响完整队列驱动程序。这就是为什么在这个特定的作业类中进行定制的原因。
    • 使用同步驱动时,并行请求处理不当
    【解决方案2】:

    您可以使用队列事件。说明如何在文档中使用: job Events laravel

    【讨论】:

    • 请解释更多
    • 我想在队列结束后将用户重定向到另一个地址
    • 你不能用 php 做到这一点,因为你的前端不知道你在等待什么。因此,您只能在将作业分派到队列后直接重定向,或者您可以执行任何任务,例如向用户发送邮件或在作业完成后更新您的数据库。所以你不能通过完成一个 Job 来触发任何前端动作。
    • 那么您对处理并行请求有什么建议?
    • 您可能正在寻找广播 (laravel.com/docs/5.8/broadcasting) 和 websockets (docs.beyondco.de/laravel-websockets)。您可以在作业完成时通知客户。或者,您可以轮询服务器以检查作业的状态。
    猜你喜欢
    • 2014-08-04
    • 1970-01-01
    • 2019-05-30
    • 1970-01-01
    • 1970-01-01
    • 2020-08-26
    • 2011-12-17
    • 1970-01-01
    • 2018-02-12
    相关资源
    最近更新 更多