我目前正在编写一个利用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循环&停止直到电话挂断。
答案 0 :(得分:0)
您不应将Web应用程序与电话后端耦合。异步是要走的路。
在最佳方案中,您可以编写Web应用程序,以便它可以使用websockets,长轮询,SSE或第三方服务,这些服务可用于将事件传递到Web应用程序并从后端进入"后端& #34;以异步的方式。
您的网络应用程序向您的"后端"的请求可以用传统方式(通过使用HTTP请求)或使用websockets来完成。
"后端"可以是在后台运行的进程(或由消息总线传递的进程的生态系统),侦听来自您的PBX和您的Web客户端的有趣事件,然后以任何必要的方式将它们传递到您的Web应用程序或PBX
示例:
您还可以使用Web应用程序中的SSE来监听事件。
我知道,我高度减少了所有血腥的细节和复杂性,只是为了让您了解应用程序的不同部分如何解耦,以便在您当前的架构中发挥一些作用:)
有道理吗?
干杯!