2016-03-30 230 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