我正试图连接到Asterisk manager接口,但我遇到了代码阻塞和连接持久性问题。以下是我所掌握的,然后是对问题的描述:
/**
* The parameters for connecting to the server
*/
$params = array('server' => '192.168.1.100', 'port' => '5038');
/**
* Instantiate Asterisk object and connect to server
*/
$ast = new Net_AsteriskManager($params);
/**
* Connect to server
*/
try {
$ast->connect();
} catch (PEAR_Exception $e) {
echo $e;
}
/**
* Login to manager API
*/
try {
$ast->login('admin', 'abcdefghi');
} catch(PEAR_Exception $e) {
echo $e;
}
就连接而言,上面的代码是有效的。我可以通过它获取数据。
问题是发送查询需要很长时间,当我在实时模式(控制台)下观察服务器时,我发现用户管理员在发送输出后从服务器注销。
换句话说,即使我在代码中没有明确注销,"admin"也会被注销。如何使此连接持久?
Asterisk AMI不会自动关闭连接,但它是由网络层完成的,当它长时间(=超时)没有检测到任何活动时,它会断开连接。为了使连接持久化,需要使其保持繁忙(=保持活动),每当连接空闲时,应用程序都应该以指定的间隔(=TTL)向目标服务器发送保持活动数据包。我们可以使用任何类型的命令作为保活数据包,比如星号中的"Ping"。
然而,如果您正在寻找一些现有的现成解决方案,那么您可以使用一些AMI代理。以下是一些已知的AMI代理
我认为您只需要使用php-agi.php类。它已经具备了你所需要的一切。没必要再写一遍。
php-agi.php以任何星号分布,可以在/var/lib/agister/agi-bin/中找到