Возникла следующая ситуация.
Существует Asterisk (core show version Asterisk 1.8.3.2), собраный на Gentoo.
Из его плана набора вызывается AGI-скрипт, который строит голосовое меню.
Версия php:
Код: Выделить всё
php --version
PHP 5.3.6-pl0-gentoo (cli)
Код: Выделить всё
Configure Command => './configure' '--prefix=/usr' '--build=i686-pc-linux-gnu' '--host=i686-pc-linux-gnu' '--mandir=/usr/share/man' '--infodir=/usr/share/info' '--datadir=/usr/share' '--sysconfdir=/etc' '--localstatedir=/var/lib' '--prefix=/usr/lib/php5.3' '--mandir=/usr/lib/php5.3/man' '--infodir=/usr/lib/php5.3/info' '--libdir=/usr/lib/php5.3/lib' '--with-libdir=lib' '--without-pear' '--disable-maintainer-zts' '--disable-bcmath' '--without-bz2' '--disable-calendar' '--disable-ctype' '--without-curl' '--without-curlwrappers' '--disable-dom' '--without-enchant' '--disable-exif' '--disable-fileinfo' '--disable-filter' '--disable-ftp' '--with-gettext' '--without-gmp' '--disable-hash' '--without-mhash' '--without-iconv' '--disable-intl' '--disable-ipv6' '--disable-json' '--without-kerberos' '--disable-libxml' '--enable-mbstring' '--with-mcrypt' '--without-mssql' '--with-onig=/usr' '--with-openssl' '--with-openssl-dir=/usr' '--enable-pcntl' '--disable-phar' '--disable-pdo' '--without-pgsql' '--without-pspell' '--without-recode' '--disable-simplexml' '--disable-shmop' '--without-snmp' '--disable-soap' '--disable-sockets' '--without-sqlite3' '--without-sybase-ct' '--disable-sysvmsg' '--disable-sysvsem' '--disable-sysvshm' '--without-tidy' '--disable-tokenizer' '--disable-wddx' '--disable-xml' '--disable-xmlreader' '--disable-xmlwriter' '--without-xmlrpc' '--without-xsl' '--disable-zip' '--without-zlib' '--disable-debug' '--enable-dba' '--without-cdb' '--with-db4' '--disable-flatfile' '--with-gdbm' '--disable-inifile' '--without-qdbm' '--without-freetype-dir' '--without-t1lib' '--disable-gd-jis-conv' '--without-jpeg-dir' '--without-png-dir' '--without-xpm-dir' '--without-gd' '--without-mysqli' '--with-unixODBC=/usr' '--without-adabas' '--without-birdstep' '--without-dbmaker' '--without-empress' '--without-esoob' '--without-ibm-db2' '--without-sapdb' '--without-solid' '--without-oci8' '--with-readline' '--without-libedit' '--disable-session' '--without-sqlite' '--with-pcre-regex=/usr' '--with-pcre-dir=/usr' '--with-config-file-path=/etc/php/cli-php5.3' '--with-config-file-scan-dir=/etc/php/cli-php5.3/ext-active' '--disable-embed' '--enable-cli' '--disable-cgi' '--disable-fpm' '--without-apxs2'
Server API => Command Line Interface
Проблема возникает в следующем месте:
необходимо завершать выполнение скрипта в случае, если вызывающая сторона положила трубку.
Для этого в самом скрипте есть обработчик:
Код: Выделить всё
declare(ticks = 1);
function agi_hangup_handler($signo)
{
syslog(LOG_INFO,"Exit cleanly");
exit (0);
}
pcntl_signal(SIGHUP, "agi_hangup_handler");
Была мысль, что что-то выставляет переменную AGISIGHUP.
при выполнении скрипта была добавлена проверка:
Код: Выделить всё
$agisighup = execute_agi('GET FULL VARIABLE ${AGISIGHUP}');
$agiresult = $agisighup['data'];
print_r($agiresult);
Функция execute_agi взята из документации к Астериску:
Код: Выделить всё
function execute_agi($command) {
fwrite(STDOUT, "$command\n");
fflush(STDOUT);
$result = fgets(STDIN);
syslog(LOG_NOTICE,"Data: ".$result);
$ret = array('code'=> -1, 'result'=> -1, 'timeout'=> false, 'data'=> '');
if (preg_match("/^([0-9]{1,3}) (.*)/", $result, $matches)) {
$ret['code'] = $matches[1];
$ret['result'] = 0;
if (preg_match('/^result=([0-9a-zA-Z]*)(?:\s?\((.*?)\))?$/', $matches[2], $match)) {
$ret['result'] = $match[1];
$ret['timeout'] = ($match[2] === 'timeout') ? true : false;
$ret['data'] = $match[2];
syslog(LOG_NOTICE,"Data: ".$match[2]);
}
}
return $ret;
}
Подскажите пожалуйста, в чем может быть проблема.