Laravel广播和队列

时间:2016-03-30 09:33:29

标签: laravel queue broadcast pusher

我正在开发一款处理视频的应用。我尝试将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)));

...

}

2 个答案:

答案 0 :(得分:3)

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

use Illuminate\Contracts\Broadcasting\ShouldBroadcastNow;

class MyEvent implements ShouldBrodcastNow
{
...
}

通过这种方式,如果您需要立即广播该事件,这应该可以解决问题。

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

答案 1 :(得分:0)

如果您的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;