【问题标题】:Is it possible create php callback on ready input stram?是否可以在读取输入流上创建 php 回调?
【发布时间】:2019-11-07 15:02:49
【问题描述】:

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

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

当频道挂起时,星号向标准输出发送“HANGUP”消息,但我使用的是 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);
   }

【问题讨论】:

    标签: asterisk fastagi


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2017-04-24
      • 2012-02-05
      • 2012-04-29
      • 2012-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多