为啥 BroadCastEvent 在 Laravel 中排队?如何阻止它?
Posted
技术标签:
【中文标题】为啥 BroadCastEvent 在 Laravel 中排队?如何阻止它?【英文标题】:Why BroadCastEvent are queued in Laravel? How to stop that?为什么 BroadCastEvent 在 Laravel 中排队?如何阻止它? 【发布时间】:2017-05-14 10:20:48 【问题描述】:我正在做一个需要实时广播经纬度的项目
我有类似下面的东西
namespace App\Events;
use App\Events\Event;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
use Illuminate\Support\Facades\Redis;
class TrackersBroadcast extends Event implements ShouldBroadcast
public $lat, $lng,$imei,$date_time
use SerializesModels;
/**
* Create a new event instance.
*
* @return void
*/
public function __construct(
$lat,
$lng,
$imei,
$date_time
)
$this->lat = $lat;
$this->lng = $lng;
$this->imei = $imei;
$this->date_time = $date_time;
/**
* Get the channels the event should be broadcast on.
*
* @return array
*/
public function broadcastOn()
return ['tracker-channel'];
在某些情况下我需要触发实时电子邮件,所以我决定像下面那样实现 laravel 消息队列
namespace App\Jobs;
use App\Jobs\Job;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Mail;
class SendAlertEmail extends Job implements ShouldQueue
use InteractsWithQueue, SerializesModels;
public $data;
/**
* Create a new job instance.
*
* @return void
*/
public function __construct($data)
$this->data=$data;
/**
* Execute the job.
*
* @return void
*/
public function handle()
//
Mail::send('emails.test', ['testVar' => $this->data], function($message)
$message->from('no-reply@sample.com', 'Website Name');
$message->to('developer@gmail.com')->subject('A simple test');
);
每当我运行php artisan queue:listen database
时,它也会将我的广播事件排队。我不想排队广播事件。该怎么做?
【问题讨论】:
您使用哪个驱动程序进行事件广播? Redis 还是 pusher? 您可以使用多个队列过程来实现这一点,正如我在下面的答案中提到的那样。 @sumit 你找到这个问题的答案了吗..? @sumit 通过从队列中排除广播事件来进一步澄清您的问题您想要实现什么? 我不想将来自 GPS 设备的广播数据的事件放在队列中......每当我为电子邮件实现队列时,广播事件也会排队...... 【参考方案1】:因为如果你扩展 ShouldBroadcast
接口,Laravel 事件广播默认排队。如果您不希望事件广播排队,您应该扩展ShouldBroadcastNow
接口。
use Illuminate\Contracts\Broadcasting\ShouldBroadcastNow;
class TrackersBroadcast implements ShouldBroadcastNow
......
所以这意味着您的事件广播将使用同步队列驱动程序。
【讨论】:
派对迟到了。这真的帮助我解决了这个问题 对不起,我迟到了;) yeeee 派对时间............你救了我......! :) 非常感谢【参考方案2】:在 Laravel 中,默认情况下所有事件广播都是排队的。
在广播事件之前,您还需要配置和运行队列监听器。所有事件广播都是通过排队作业完成的,因此您的应用程序的响应时间不会受到严重影响。
在你的情况下,你需要两个队列驱动程序。一种用于具有实时支持的事件广播。一种用于处理具有队列支持的电子邮件。为此,您需要两个队列驱动程序。你可以在config/queue.php
中定义它们
在您的 SendAlertEmail
班级中执行此操作。
public $broadcastQueue = 'queue-name-for-handling-emails';
在您的TrackersBroadcast
中声明实时队列。这是您的 redis
队列驱动程序。
public $broadcastQueue = 'real-time-queue';
参考Broadcast queue下Defining broadcast events
然后你可以像这样监听你的两个队列
$php artisan queue:listen --queue="queue-name-for-handling-emails"
$php artisan queue:listen --queue="real-time-queue"
参考Why event broadcast is queued ?
希望你觉得这很有用。
【讨论】:
您的解决方案是分离出 2 个队列,抱歉它仍然没有帮助,因为我需要从队列中排除广播事件。我意识到所有的事件广播都是排队的,我们不应该为此烦恼。感谢您的贡献。【参考方案3】:也许您可以像这样在广播事件中提及队列名称,并且不要听该队列以防您不需要处理
//php artisan queue:listen --queue=broadcast-queue
/**
* @return string
*/
public function onQueue()
return 'broadcast-queue';
【讨论】:
以上是关于为啥 BroadCastEvent 在 Laravel 中排队?如何阻止它?的主要内容,如果未能解决你的问题,请参考以下文章