Php Pusher和laravel回声太慢或者我的代码有问题?
我在homestead上使用Laravel 5.3。下面是我用来通过pusher和laravel echo广播事件的代码,用于实时通知用户一条新消息-Php Pusher和laravel回声太慢或者我的代码有问题?,php,laravel-5.3,pusher,laravel-echo,Php,Laravel 5.3,Pusher,Laravel Echo,我在homestead上使用Laravel 5.3。下面是我用来通过pusher和laravel echo广播事件的代码,用于实时通知用户一条新消息- class NewMessageReceived implements ShouldBroadcast { use InteractsWithSockets, SerializesModels; public $message; public $user; public $sender; /**
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倍。我只需要删除事件触发部分,以使其运行更快(这是不需要的,因为我想实时更新用户)-
如果您能帮助我找出这种行为背后的原因,以及如何让这一切实时发生,而不是现在存在的延迟,那将非常有帮助。尝试以下方法:
将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;
试试这个:
将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;
您应该将
ShouldBroadcast
更改为ShouldBroadcastNow
。这将解决延迟问题。您应该将ShouldBroadcast
更改为ShouldBroadcastNow
。这将解决延迟问题。这对于重构现有代码很好。谢谢但上述担忧仍未解决。我没有为上述广播使用任何队列,即使我配置了队列驱动程序(数据库),广播也不会排队并同步触发。这违反了文件中提供的说明。也许这也是它速度慢的原因。我现在正在寻找一个解决这个问题的方法。这对于重构现有的代码是很好的。谢谢但上述担忧仍未解决。我没有为上述广播使用任何队列,即使我配置了队列驱动程序(数据库),广播也不会排队并同步触发。这违反了文件中提供的说明。也许这也是它速度慢的原因。目前我正在寻找解决这个问题的方法。