在PAMI中发起呼叫 - 无限循环

时间:2015-11-30 12:47:25

标签: php asterisk

我目前正在编写一个利用PAMI与Asterisk服务器通信的脚本。

我发起呼叫的代码如下:

public function store(Requests\CallRequest $request, ClientImpl $a)
{
    $originateMsg = new OriginateAction('Local/' . $request->agent . '@auto-answer');
    $originateMsg->setContext('G-Outgoing');
    $originateMsg->setPriority('1');
    $originateMsg->setExtension($request->dial);
    $a->send($originateMsg);

    while(true) {
        if( $a->process() ) return redirect(route('call-hangup'));
        usleep(1000);
    }

    $a->close();
}

问题是,我必须引发无限循环,直到发出挂断请求。 $a->process()调用以下方法:

class VoipEventStart implements IEventListener
{
    public function handle(EventMessage $event)
    {
        $a = $event->getKeys();

        if( ($a['event'] == "Hangup" || $a['event'] == "HangupRequest") && strpos($a['channel'], 'SIP/') !== FALSE)
        {
            return true;
        }

        return false;
    }
}

我在追求......

无论如何,我可以设置此进程在没有页面看起来像是因为while循环而尝试加载的情况下运行吗?

javascript可以提供任何帮助吗?我确实想过使用AJAX来发出请求,但它仍然会遇到while循环&停止直到电话挂断。

1 个答案:

答案 0 :(得分:0)

您不应将Web应用程序与电话后端耦合。异步是要走的路。

在最佳方案中,您可以编写Web应用程序,以便它可以使用websockets,长轮询,SSE或第三方服务,这些服务可用于将事件传递到Web应用程序并从后端进入"后端& #34;以异步的方式。

您的网络应用程序向您的"后端"的请求可以用传统方式(通过使用HTTP请求)或使用websockets来完成。

"后端"可以是在后台运行的进程(或由消息总线传递的进程的生态系统),侦听来自您的PBX和您的Web客户端的有趣事件,然后以任何必要的方式将它们传递到您的Web应用程序或PBX

示例:

  1. 用户按下"电话"按钮。
  2. 您的Web应用程序向Web控制器发出HTTP请求。
  3. Web控制器接收请求并使用拨号信息将json有效负载注入到您的消息总线中。
  4. 一名工作人员正在聆听正确类型的有效载荷"选择此类"并选择一个随机的星号节点来发出拨号。
  5. Originate操作将发送到所选节点。
  6. 侦听来自不同Asterisk节点的事件的一个或多个进程会获取拨号事件,并通过websocket将其发送到您的Web应用程序。你应该能够"绑定"一个或多个渠道或操作ID到正确的Web客户端。
  7. 您还可以使用Web应用程序中的SSE来监听事件。

    我知道,我高度减少了所有血腥的细节和复杂性,只是为了让您了解应用程序的不同部分如何解耦,以便在您当前的架构中发挥一些作用:)

    有道理吗?

    干杯!