【问题标题】:Laravel Broadcasting and QueuesLaravel 广播和队列
【发布时间】:2016-03-30 09:33:29
【问题描述】:

我正在开发一个应用来处理视频。我尝试将 10 个视频推送到队列中。处理完视频后,我触发了这样一个事件:

...
$production->render();

event(new VideoHasProcessed(basename($this->video->path)));
...

我会关注这个视频向用户推送通知 (https://laracasts.com/series/whats-new-in-laravel-5-1/episodes/12)

问题是:我想在处理每个视频时推送通知,但实际上,在处理了 10 个视频后才显示通知。

这是我的脚本:

<script>
    (function () {
        var pusher = new Pusher(PUSHER_ID, {
            encrypted: true
        });

        var channel = pusher.subscribe('test');

        channel.bind('App\\Events\\VideoHasProcessed', function(data) {
            console.log(data);
        });
    })();
</script>

更新:

派遣工作

foreach ($request->input('files') as $file)
    {
        ...

        // Dispatch a job.
        $this->dispatch(new ProduceVideo($video));

        ....
    }

还有我的工作类别:

公共函数句柄(ProductionRepository $production) { ...

$production->render();

event(new VideoHasProcessed(basename($this->video->path)));

...

}

【问题讨论】:

    标签: laravel queue broadcast pusher


    【解决方案1】:

    在深入研究 laravel 5.3 核心后,我找到了解决方案。你的事件类需要扩展 ShouldBrodcastNow 接口:

    use Illuminate\Contracts\Broadcasting\ShouldBroadcastNow;
    
    class MyEvent implements ShouldBrodcastNow
    {
    ...
    }
    

    这样,如果您需要立即广播活动,这应该可以解决问题。

    注意:MyEvent 不需要实现两个接口(ShouldBroadcastNow, ShouldBroadcast),因为接口ShouldBroadcastNow 已经扩展了ShouldBroadcast

    【讨论】:

    • 这是我一直在寻找的,因为我希望我的推送事件响应更快,因为它是从已经排队的后端作业中触发的。
    【解决方案2】:

    如果您的 10 个视频中的每一个都作为单独的排队作业处理,您只需在每个排队作业中触发您的事件。这是作业类的示例句柄函数(请参阅https://laravel.com/docs/5.2/queues#job-class-structure):

    /**
     * Execute the job.
     */
    public function handle()
    {
        // Your video processing script
    
        // Fire your event
        event(new VideoHasProcessed(basename($this->video->path)));
    }
    

    如果您的视频作为 1 个作业处理,您需要将事件添加到您可能用于处理每个视频的任何循环中:

    foreach($videos as $video):
        // Your video processing script
    
        // Fire your event
        event(new VideoHasProcessed(basename($this->video->path)));
    endforeach;
    

    【讨论】:

    • 我已经在每个排队的作业中触发了我的事件。但它在处理 10 个视频时仍会显示通知。我刚刚在帖子中添加了更多代码。
    • 即使我将 1 个视频添加到队列中并且第一个视频正在处理中,我又添加了 1 个视频,它仍然不会推送单独的通知。当处理 2 个视频时,会推送 2 个通知。
    • render() 方法有什么作用?
    猜你喜欢
    • 2019-07-10
    • 1970-01-01
    • 2017-11-07
    • 1970-01-01
    • 2017-04-15
    • 2021-04-17
    • 1970-01-01
    • 1970-01-01
    • 2018-04-13
    相关资源
    最近更新 更多