断开Asterisk Manager时出错

时间:2015-06-16 01:24:32

标签: php asterisk agi

我正在使用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中不是有效的流资源

1 个答案:

答案 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');