断开星号管理器的连接时出错


Error disconnecting Asterisk Manager

我正在使用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');