是否有可能在就绪的输入stram上创建php回调?

问题描述 投票:0回答:1

我有一个在某些情况下会循环播放的星号快速AGI应用程序。区别在于,如果通道挂断,则本地启动的AGI脚本星号会删除。

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

[当频道挂起时,星号将“ HANGUP”消息发送到stdout,但是我使用了synca phpagi lib,所以错过了它。所以我的问题是:

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

  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个回答
0
投票

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

如果未启动,则说明您已挂断频道。

如果发生错误或挂断,诸如回放和读取之类的操作也会返回-1(请参阅内部文档。)>

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.