Я использую Laravel 5.3 на ферме. Вот код, который я использую для трансляции события через эхо-сигналы толчка и лары, чтобы уведомлять пользователей о новом сообщении в режиме реального времени —
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;
}
В vue есть вызов ajax, который получает ответ, сгенерированный приведенным выше кодом, т.е. $ m.
Проблема в том, что если я использую приведенный ниже код вместо приведенного выше, ответ будет получен как минимум в 5 раз быстрее. Мне просто нужно удалить часть запуска событий, чтобы она работала быстрее (что нежелательно, так как я хочу обновить пользователя в реальном времени) —
try{
$m = $privateChat->messages()->save($m);
return $m;
}
catch(Exception $e){
return $e;
}
Было бы полезно, если бы вы могли помочь мне определить причину такого поведения и узнать, как я могу заставить все это происходить в режиме реального времени, вместо существующей задержки.
Попробуй это:
Переместите свою логику 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;
Других решений пока нет …