2017-01-24 6 views
1

私はホームステッドにLaravel 5.3を使用しています。ここで私は、リアルタイムで新しいメッセージをユーザーに通知するために、プッシャーとlaravelエコーを通じてイベントを放送するために使用していたコードだ -プッシャーとララベルのエコーが遅すぎるか、コードに問題がありますか?

class NewMessageReceived implements ShouldBroadcast 
{ 
    use InteractsWithSockets, SerializesModels; 
    public $message; 
    public $user; 
    public $sender; 
    /** 
    * Create a new event instance. 
    * 
    * @return void 
    */ 
    public function __construct(Message $message, User $user) 
    { 
     $this->message = $message; 
     $this->user = $user; 
     $this->sender = \Auth::user(); 
    } 

    /** 
    * Get the channels the event should broadcast on. 
    * 
    * @return Channel|array 
    */ 
    public function broadcastOn() 
    { 
     return new PrivateChannel('user.'. $this->user->id); 
    } 

} 

ここでは、これが

 try{ 
      $m = $privateChat->messages()->save($m); 
       if(isset(Auth::user()->guide)) 
        event (new NewMessageReceived($m, $m->messageable->tourist->user)); 
       else 
        event (new NewMessageReceived($m, $m->messageable->guide->user)); 

       return $m; 
      } 
      catch(Exception $e){ 
       return $e; 
      } 
をevent-呼び出すコードです

vueにajax呼び出しがあります。これは、上記のコード、すなわち$ mによって生成された応答を受け取ります。

上記のコードの代わりに以下のコードを使用すると、応答が少なくとも5倍速くなります。私はちょうど(私がリアルタイムでユーザーを更新するために、希望されていない)、それはより速く走らせるためにイベント・発火の部分を削除する必要がある -

try{ 
     $m = $privateChat->messages()->save($m); 

      return $m; 
     } 
     catch(Exception $e){ 
      return $e; 
     } 

あなたは私が発見助けることができればそれが役立つだろうこの動作の背後にある理由と、今存在する遅延の代わりに、どうすればリアルタイムでそのすべてを実現できるのでしょうか。

答えて

0

これを試してみてください:

は、今イベントのクラスにあなたのイベントの呼び出しを

class NewMessageReceived implements ShouldBroadcast 
{ 
    use InteractsWithSockets, SerializesModels; 
    public $message; 
    public $user; 
    public $sender; 
    /** 
    * Create a new event instance. 
    * 
    * @return void 
    */ 
    public function __construct(Message $message) 
    { 
     $this->message = $message; 

     $this->user = isset(Auth::user()->guide)) ? $message->messageable->tourist->user : $this->user = $message->messageable->guide->user; 
     $this->sender = \Auth::user(); 
    } 

    /** 
    * Get the channels the event should broadcast on. 
    * 
    * @return Channel|array 
    */ 
    public function broadcastOn() 
    { 
     return new PrivateChannel('user.'. $this->user->id); 
    } 

} 

をあなたのロジック場合を移動

$m = $privateChat->messages()->save($m); 
event(new NewMessageReceived($m)); 
return $m; 
+0

既存のコードをリファクタリングするのに適しています。ありがとう!しかし、上記の懸念はまだ解決されていません。私は上記のブロードキャスト用のキューを使用していません。キュードライバ(データベース)を設定しても、ブロードキャストはキューに入れられず、同期して起動しません。ドキュメントに記載されている指示に反します。たぶんそれが遅い理由かもしれません。私は現時点でこの問題を修正しています。 –

関連する問題