【问题标题】:Laravel: Actively listening events from external serviceLaravel:主动监听来自外部服务的事件
【发布时间】:2019-01-19 08:02:23
【问题描述】:

我正在使用 Laravel 开发一个 PBX 监控应用程序。在 PBX 端,Asterisk 正在管理呼叫。

我可以使用PAMI 客户端接收来自Asterisk Manager Interface 的所有事件。如果我只是从控制台运行这个脚本,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();

我正在尝试使用 PAMI 在 Laravel 中实现事件和侦听器。但这似乎不起作用。

我已经在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 事件?

【问题讨论】:

    标签: php laravel events laravel-5 asterisk


    【解决方案1】:

    所有这些代码都不属于一个事件。一个事件只是为了宣布某事已经发生,并包含关于它是什么的所有重要信息。您用于运行客户端和睡眠的代码以及所有这些都应该在其他地方,可能是您的内核继续运行的工匠命令。然后在该代码中,当发生某些事情时,您会触发一个带有消息的简单事件,供任何听众采取行动:

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

    【讨论】:

      猜你喜欢
      • 2016-12-29
      • 2018-06-11
      • 2019-10-15
      • 1970-01-01
      • 2017-02-25
      • 1970-01-01
      • 1970-01-01
      • 2016-01-09
      • 1970-01-01
      相关资源
      最近更新 更多