我有一个在某些情况下会循环播放的星号快速AGI应用程序。区别在于,如果通道挂断,则本地启动的AGI脚本星号会删除。
在网络AGI的情况下,如果通道挂起,则agi脚本将继续工作,并且通道循环等待此脚本完成。
[当频道挂起时,星号将“ HANGUP”消息发送到stdout,但是我使用了synca phpagi lib,所以错过了它。所以我的问题是:
如何绑定准备读取stdin事件并调用函数回调(将检测可能的挂断)?
如果没有挂断检测,如何将数据返回标准输入?
首先,我尝试找到一些简单的方法来解决此问题
我的测试代码看起来像这样
while( 5 < 6)
{
$data = $agi->request;
$chan = $data['agi_channel'];
$agi->Verbose(print_r($chan,1));
$res = $agi->exec('Wait','5');
$agi->Verbose('res = '.print_r($res,1));
$res = $agi->exec('Playback',$path);
$agi->Verbose('res = '.print_r($res,1));
$var = 'ret.'.time();
$res = $agi-> exec('Read',$var.','.$path.','.$max);
$agi->Verbose('res = '.print_r($res,1));
unset($res);
}
您可以在每个循环之前使用功能CHANNEL(状态)查询,并检查通道的当前状态。
如果未启动,则说明您已挂断频道。
如果发生错误或挂断,诸如回放和读取之类的操作也会返回-1(请参阅内部文档。)>
如果您的框架是同步的,则没有选择创建回调。使用异步框架或线程。
如果仅使用AGI(而不是FastAGI),则还可以选择启用SIG_KILL处理程序。FastAGI通过套接字工作,因此没有事件。
其他选项是在第二个线程中读取AMI事件。