Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 为什么广播事件在Laravel中排队?如何阻止这种情况?_Php_Laravel_Redis_Message Queue_Laravel Broadcast - Fatal编程技术网

Php 为什么广播事件在Laravel中排队?如何阻止这种情况?

Php 为什么广播事件在Laravel中排队?如何阻止这种情况?,php,laravel,redis,message-queue,laravel-broadcast,Php,Laravel,Redis,Message Queue,Laravel Broadcast,我在工作的项目,需要实时广播纬度和经度 我有下面这样的东西 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 imple

我在工作的项目,需要实时广播纬度和经度

我有下面这样的东西

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


}
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');
        });
    }
}
在某些情况下,我需要触发实时电子邮件,所以我决定实现如下所示的laravel消息队列

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


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


可能是这样的:您可以在这样的广播事件中提及队列名称,而不必监听该队列,以防您不需要处理

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

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

在Laravel中,默认情况下,所有事件广播都排队

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

你需要两个排队司机。一个用于实时支持的事件广播。一个用于处理具有队列支持的电子邮件。为此,你需要两个排队司机。您可以在
config/queue.php

在您的
sendalertmail
类中执行此操作

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"
提及


希望你觉得这个有用

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

use Illuminate\Contracts\Broadcasting\ShouldBroadcastNow;

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

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

您使用哪个驱动程序进行事件广播?Redis或pusher?正如我在下面的回答中提到的,您可以使用多队列过程来实现这一点。@sumit您找到这个问题的答案了吗?@sumit通过从队列中排除广播事件来进一步澄清您的问题您试图实现什么?我不想将从GPS设备广播数据的事件放在队列中。。无论何时我实现了电子邮件队列,广播事件也在队列中…您的解决方案是分离出2个队列,很抱歉,这仍然没有帮助,因为我需要从队列中排除广播事件。我意识到所有的活动广播都是排队的,我们不应该为此烦恼。谢谢你的贡献。晚会迟到了。这真的帮助我解决了这个问题。对不起,我迟到了;)yeeee派对时间……你救了我……!:)很多
public $broadcastQueue = 'real-time-queue';