Как установить постоянное соединение с менеджером Asterisk с помощью PHP?

Я пытаюсь подключиться к интерфейсу диспетчера Asterisk, и у меня возникают проблемы с блокировкой кода, а также с сохранением соединения. Ниже то, что у меня есть, а затем описание того, что происходит не так:

/**
 * 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» выходит из системы, хотя я явно не вышел из системы в коде. Как я могу сделать это соединение постоянным?


person Arham Ali Qureshi    schedule 14.03.2012    source источник
comment
Я довольно хорошо знаком с Asterisk и внес некоторые изменения в ваш вопрос, чтобы улучшить читаемость и ясность. Пожалуйста, проверьте мои правки, чтобы убедиться, что они верны. Не стесняйтесь вносить любые изменения, которые должны быть сделаны, если я допустил какие-либо ошибки.   -  person Tim Post♦    schedule 15.03.2012
comment
@TimPost Спасибо ..! Я всегда испытываю трудности при написании кода HTML здесь. Хотя я пытался читать справку каждый раз, когда я публикую. ‹br› И Тим, не могли бы вы дать мне свой адрес Skype или адрес электронной почты, мне нужно обсудить с вами несколько вещей, которые могут помочь нам обоим.   -  person Arham Ali Qureshi    schedule 15.03.2012


Ответы (2)


Asterisk AMI не закрывает соединение автоматически, однако это делает сетевой уровень, когда он не обнаруживает активности в течение длительного времени (= тайм-аут), он разрывает соединение. Чтобы сделать соединение постоянным, необходимо, чтобы оно было занято (= поддерживать активность), всякий раз, когда соединение простаивает, ваше приложение должно отправлять пакеты поддержки активности на целевой сервер с заданным интервалом (= TTL). Мы можем использовать любой тип команды в качестве пакета поддержки активности, например, в звездочке вы можете использовать «Ping».

Однако, если вы ищете какое-то существующее готовое к использованию решение, вы можете использовать для этого AMI Proxy. вот некоторые известные прокси AMI

person Nasir Iqbal    schedule 17.03.2012

Я думаю, вы просто используете класс php-agi.php. в нем уже есть все, что вам нужно. Нет необходимости писать это снова.

php-agi.php распространяется с любым астериском и находится в /var/lib/asterisk/agi-bin/

person arheops    schedule 15.03.2012
comment
На самом деле, я только что посмотрел на класс, который вы упомянули (просто собирался отредактировать здесь пример для вас), и моя версия класса — ` @version 2.0`, я не вижу опции для постоянного соединения (хотя это повторно использует сокет). Я что-то пропустил? - person Tim Post♦; 15.03.2012
comment
Я не использую AGI, я использую AMI, но если у вас есть идеи, чем AGI лучше, чем AMI, сообщите мне. Проще говоря, я много искал в Google, но не мог понять разницу. - person Arham Ali Qureshi; 15.03.2012
comment
AGI — это управляющее соединение (т. е. диалплан подключается к программе), а AMI — управляющее соединение (внешняя программа подключается к звездочке/прослушиванию событий). извините, я пропустил. но общий ответ тот же. есть некоторые реализации класса AMI в PHP, нет необходимости создавать свои собственные. поиск voip-info.org по слову AMI. - person arheops; 16.03.2012
comment
@arheops на самом деле я создаю свое собственное веб-приложение. Я думаю, что я должен использовать AMI, что вы скажете? ‹br› Я разместил приведенный выше код с voip-info.org ‹br› Проблема в том, что отправка запроса занимает довольно много времени, и когда я наблюдаю за сервером в режиме реального времени (консоль), я вижу, что пользователь admin получает выйти из сервера после отправки вывода. - person Arham Ali Qureshi; 16.03.2012
comment
вы должны использовать сочетание архитектуры ami, fastagi и диалплана + реального времени. Вам не следует создавать собственное веб-приложение, если вы не понимаете, что происходит. кроме варианта, когда в приложении никогда не будет больше 1-2 каналов. если вы все еще думаете, что у вас есть, проверьте код ДРУГИХ людей, таких как этот code.google. com/p/asterisk-php-api - person arheops; 16.03.2012