繁体   English   中英

为什么BroadCastEvent在Laravel中排队? 怎么阻止?

[英]Why BroadCastEvent are queued in Laravel? How to stop that?

我正在研究需要实时广播纬度和经度的项目

我有类似下面的东西

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它也会排队我的广播事件。 我不想排队广播事件。 怎么做?

在此输入图像描述

因为如果扩展ShouldBroadcast接口,Laravel Event Broadcasting默认排队。 如果您不希望事件广播排队,则应扩展ShouldBroadcastNow接口。

use Illuminate\Contracts\Broadcasting\ShouldBroadcastNow;

class TrackersBroadcast implements ShouldBroadcastNow
{
......
}

所以这意味着你的事件广播将使用同步队列驱动程序。

在Laravel中,所有事件广播都默认排队。

在广播事件之前,您还需要配置并运行队列侦听器。 所有事件广播都是通过排队的作业完成的,这样您的应用程序的响应时间就不会受到严重影响。

在你的情况下,你将需要两个队列驱动程序。 一个用于实时广播和实时支持。 一个用于处理具有队列支持的电子邮件。 为此你需要两个队列驱动程序。 您可以在config/queue.php定义它们

在您的SendAlertEmail类中执行此操作。

public $broadcastQueue = 'queue-name-for-handling-emails';

TrackersBroadcast状态下实时队列。 这是你的redis队列驱动程序。

public $broadcastQueue = 'real-time-queue';

定义广播事件下引用广播队列

然后你可以像这样听你的两个队列

$php artisan queue:listen --queue="queue-name-for-handling-emails"
$php artisan queue:listen --queue="real-time-queue"

请参阅为什么事件广播排队?

希望您觉得这个有帮助。

也许你可以在这样的广播事件中提及队列名称,并且不要在不需要处理的情况下监听该队列

//php artisan queue:listen --queue=broadcast-queue

    /**
         * @return string
         */
        public function onQueue()
        {
            return 'broadcast-queue';
        }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM