Laravel: активно слушает события из внешнего сервиса

Я разрабатываю приложение для мониторинга АТС с Laravel. На стороне АТС, звездочка управляет звонками.

я могу использовать П клиент для получения всех событий от Интерфейс Asterisk Manager. Если я просто запускаю этот скрипт из консоли, все события в Asterisk выводятся на экран в режиме реального времени:

<?php

require __DIR__ . '/vendor/autoload.php';

use PAMI\Client\Impl\ClientImpl as PamiClient;
use PAMI\Message\Event\EventMessage;
use PAMI\Listener\IEventListener;


$pamiClientOptions = array(
'host' => '',
'scheme' => 'tcp://',
'port' => 5038,
'username' => '',
'secret' => '',
'connect_timeout' => 10000,
'read_timeout' => 10000
);

$pamiClient = new PamiClient($pamiClientOptions);


// Open the connection
$pamiClient->open();

$pamiClient->registerEventListener(function (EventMessage $event) {
var_dump($event);
});
$running = true;
// Main loop
while($running) {
$pamiClient->process();
usleep(1000);
}
// Close the connection
$pamiClient->close();

То, что я пытаюсь сделать, это реализовать события&слушатели в Laravel с PAMI. Но это не похоже на работу.

Я зарегистрировал событие и слушатель на EventServiceProvider учебный класс:

protected $listen = [
'App\Events\AmiEventOccurred' => [
'App\Listeners\LogAmiEvent',
],

Мой класс событий:

<?php

namespace App\Events;

use Illuminate\Queue\SerializesModels;
use Illuminate\Foundation\Events\Dispatchable;

class AmiEventOccurred
{
use Dispatchable, SerializesModels;

public $message;

/**
* Create a new event instance.
*
* @return void
*/
public function __construct()
{
$pamiClientOptions = array(
'host' => getenv('PAMI_HOST'),
'scheme' => getenv('PAMI_SCHEME'),
'port' => getenv('PAMI_PORT'),
'username' => getenv('PAMI_USERNAME'),
'secret' => getenv('PAMI_SECRET'),
'connect_timeout' => getenv('PAMI_CONNECT_TIMEOUT'),
'read_timeout' => getenv('PAMI_READ_TIMEOUT'),
);

$pamiClient = new \PAMI\Client\Impl\ClientImpl($pamiClientOptions);

// Open the connection
$pamiClient->open();

$pamiClient->registerEventListener(function (\PAMI\Message\Event\EventMessage $message) {
$this->message = $message;
});

$running = true;

// Main loop
while($running) {
$pamiClient->process();
usleep(1000);
}

// Close the connection
$pamiClient->close();

}
}

Мой класс слушателя:

<?php

namespace App\Listeners;

use App\Events\AmiEventOccurred;

class LogAmiEvent
{
/**
* Create the event listener.
*
* @return void
*/
public function __construct()
{
//
}

/**
* Handle the event.
*
* @param  AmiEventOccurred  $event
* @return void
*/
public function handle(AmiEventOccurred $event)
{
Log::debug(print_r($event, true));
}
}

Это правильный подход? Можно ли активно слушать другой сервис в режиме реального времени с событиями Laravel или мне следует разработать другое приложение, которое будет работать в фоновом режиме в реальном времени и при необходимости запускать события Laravel?

1

Решение

Весь этот код не принадлежит событию. Событие просто для того, чтобы объявить, что что-то произошло, и содержит всю важную информацию о том, что это было. Ваш код для запуска клиента и спящего режима, и все это должно быть где-то еще, вероятно, кустарная команда, которую продолжает работать ваше ядро. Затем в этом коде, когда что-то происходит, вы запускаете простое событие с сообщением для любых слушателей:

$pamiClient->registerEventListener(function (\PAMI\Message\Event\EventMessage $message) {
new AmiMessageReceived($message);
});
1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector