我正在使用Asterisk 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 不是/scripts/phpagi/phpagi-asmanager.php 第 158 行的有效流资源
打开套接字$asm->connect();
,$asm->disconnect();
关闭套接字。
问题是,disconnect
关闭事件回调中的套接字,但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');