Почему BroadCastEvent стоят в очереди в 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'];
}
}
В некоторых случаях мне нужно запускать электронную почту в реальном времени, поэтому я решил реализовать очередь сообщений 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
это поставит в очередь мое вещательное событие также. Я не хочу ставить в очередь событие трансляции. Как это сделать?
3 ответа
Потому что Laravel Event Broadcasting ставится в очередь по умолчанию, если вы расширяете ShouldBroadcast
интерфейс. Если вы не хотите, чтобы 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';
}