2017-01-24 10 views
1

Я использую Laravel 5.3 на усадьбе. Вот код, который я использую для трансляции события через толкатель и Laravel эхо, чтобы уведомить пользователей о новом сообщении в режиме реального времени -Pusher и laravel echo слишком медленно или что-то не так с моим кодом?

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; 
      } 

Существует ajax-вызов в vue, который получает ответ, сгенерированный вышеуказанным кодом, т.е. $ 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

Это хорошо для реорганизации существующего кода. Благодаря! Но высказанная выше озабоченность по-прежнему остается нерешенной. Я не использую какую-либо очередность для вышеупомянутой трансляции, и даже если я настрою драйвер очереди (базу данных), трансляция не поставлена ​​в очередь и синхронно срабатывает. Это противоречит инструкциям, приведенным в документации. Возможно, это также причина, по которой она медленная. На данный момент я исправляю эту проблему. –