我目前正在编写一个使用PAMI与Asterisk服务器通信的脚本。
我发起呼叫的代码如下:
public function store(RequestsCallRequest $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();
}
问题是,我必须启动一个无限while循环,直到发出挂断请求。$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循环&停下来,直到挂断电话。
您不应该将web应用程序与电话后端耦合。异步是前进的道路。
在最好的情况下,您可以编写web应用程序,使其可以使用websocket、长轮询、SSE或第三方服务,该服务可用于将事件传递到您的web应用程序并以异步方式从"后端"传入。
从web应用程序到"后端"的请求可以通过传统方式(使用HTTP请求)或使用websocket来完成。
"后端"可以是一个在后台运行的进程(或通过消息总线通信的进程生态系统),监听来自您的PBX和web客户端的有趣事件,然后通过任何必要的方式将它们传递给您的web应用程序或PBX。
示例:
- 用户按下"呼叫"按钮
- 您的web应用程序向web控制器发出HTTP请求
- web控制器接收请求,并将json有效载荷与拨号信息一起注入到消息总线中
- 监听正确类型有效载荷的工作人员"拾取"并选择一个随机的星号节点来发出拨号
- 发起人操作被发送到所选节点
- 一个或多个侦听来自不同Asterisk节点的事件的进程会拾取拨号事件,并通过websocket将其发送到您的web应用程序。您应该能够将一个或多个通道或操作ID"绑定"到正确的web客户端
您还可以使用web应用程序中的SSE来侦听事件。
我知道,我高度减少了所有血腥的细节和复杂性,只是为了让你了解应用程序的不同部分解耦将如何在你当前的架构中发挥作用:)
有道理吗?
干杯!