Я разрабатываю приложение для мониторинга АТС с 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?
Весь этот код не принадлежит событию. Событие просто для того, чтобы объявить, что что-то произошло, и содержит всю важную информацию о том, что это было. Ваш код для запуска клиента и спящего режима, и все это должно быть где-то еще, вероятно, кустарная команда, которую продолжает работать ваше ядро. Затем в этом коде, когда что-то происходит, вы запускаете простое событие с сообщением для любых слушателей:
$pamiClient->registerEventListener(function (\PAMI\Message\Event\EventMessage $message) {
new AmiMessageReceived($message);
});
Других решений пока нет …