0

我有在某些情况下循环的星号快速 AGI 应用程序。不同之处在于,如果频道挂断,本地启动的 AGI 脚本星号会下降。

在网络 AGI 的情况下,如果通道挂起,则 agi 脚本继续工作,通道循环等待完成此脚本。

当频道挂起时,星号将“挂断”消息发送到标准输出,但我使用了 synchronius phpagi lib,错过了它。所以我的问题是:

  1. 如何绑定准备读取标准输入事件并调用函数回调(这将检测可能的挂断)?

  2. 如果没有挂断检测,如何将数据返回到标准输入?

首先,我尝试找到一些简单的方法来解决这个问题

我的测试代码看起来像这样

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);
   }
4

1 回答 1

0

您可以在每个循环之前使用函数 CHANNEL(state) 查询并检查通道的当前状态。

如果它没有 UP,那么你已经挂断了频道。

如果出现错误或挂断,播放和读取等操作也会返回 -1(请参阅内部文档)。

如果您的框架是同步的,则您没有创建回调的选项。使用异步框架或线程。

如果您只使用 AGI(不是 FastAGI),您还可以选择启用 SIG_KILL 处理程序。FastAGI 通过套接字工作,因此没有事件。

其他选项是在第二个线程中读取 AMI 事件。

于 2019-11-06T22:27:34.493 回答