我正在使用Asterisk Manager来获取来电的事件。我想在一个" Ring"收到了活动。
以下是我的代码,用于检查" Ring"接到电话后的活动。我的代码断开了Manager,但也产生了错误。有时,错误消息会多次出现。
我做错了什么?
<?php
require_once('phpagi/phpagi.php');
function newstatus($ecode,$data,$server,$port){
if (!isset($data['ChannelStateDesc'])){
$data['ChannelStateDesc'] = '';
}
print_r($data);
if ($data['Event'] == "Newchannel" && $data['ChannelStateDesc'] == "Ring") {
echo "Call Ringing!!!\n";
global $asm;
$asm->disconnect();
}
}
$e = 'ENTERQUEUE';
if ($e == 'ENTERQUEUE'){
$asm = new AGI_AsteriskManager();
$asm->connect();
$asm->add_event_handler("Newchannel", "newstatus");
$asm->wait_response(true);
}
错误讯息:
PHP警告:fgets():9在第158行的/scripts/phpagi/phpagi-asmanager.php中不是有效的流资源
答案 0 :(得分:1)
使用$asm->connect();
打开套接字,
使用$asm->disconnect();
关闭套接字。
问题是,disconnect
关闭了eventcallback中的套接字,但是wait_response
是一个事件循环,并且在断开状态下再次调用了事件处理程序。
如果刚刚发送了请求,wait_response将返回响应。否则,它将永远循环,处理事件。
如果你有剩余的代码,你可以在事件处理程序中调用该代码(函数)(即new_status)。如果要对每个事件执行某些操作,可以注册通配符事件处理程序。
function newstatus($ecode, $data, $server, $port)
{
// ...
echo "Call Ringing!!!\n";
do_something($data);
// ...no disconnect necessary
}
function on_all_events(...)
{
// ...
}
function do_something($data)
{
var_dump($data);
}
add_event_handler('*', 'on_all_events');