3

ホームステッドで 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;
            }

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

問題は、上記のコードの代わりに以下のコードを使用すると、応答が少なくとも 5 倍速く受信されることです。実行を高速化するために、イベント発生部分を削除するだけです (ユーザーをリアルタイムで更新したいので、これは望ましくありません)-

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

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

この動作の背後にある理由と、現在存在する遅延ではなく、リアルタイムですべてを実現する方法を見つけていただけると助かります。

4

2 に答える 2

1

これを試して:

if ロジックをイベント クラスに移動する

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;
于 2017-01-26T17:21:00.913 に答える