2016-03-30 193 views
2

我正在开发一个应用程序来处理视频。我尝试将10个视频放入队列中。视频被处理后,我解雇这样一个事件:Laravel广播和队列

... 
$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->render(); 

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

... 

}

回答

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; 
+0

我已经解雇我的每一个事件已经排队的作业。但当处理10个视频时,它仍会显示通知。我只是在我的帖子中添加了更多代码。 – user3118789

+0

即使我将1个视频添加到队列中,并且第一个视频正在处理中,我还会添加1个视频,但它仍然不会推送单独的通知。处理2个视频时,2个通知会一起推送。 – user3118789

+0

请帮助我!谢谢。 – user3118789

3

在挖入laravel 5.3核心后,我发现了解决方案。您事件类需要扩展ShouldBrodcastNow接口:

use Illuminate\Contracts\Broadcasting\ShouldBroadcastNow; 

class MyEvent implements ShouldBrodcastNow 
{ 
... 
} 

这样一来,如果你需要的情况下马上要播出,这应该做的伎俩。

注:没有需要MyEvent来实现这两个接口(ShouldBroadcastNow, ShouldBroadcast)因为接口ShouldBroadcastNow已经扩展ShouldBroadcast

+0

这就是我正在寻找的,因为我希望我的推送器事件能够更快地响应,因为它是从已经排队的后端作业中解雇的。 – Throttlehead