PHP сокеты, постоянное подключение к серверу для получения событий от Asterisk AMI? - PullRequest
1 голос
/ 11 октября 2011

Я ищу сценарий PHP, который будет действовать как мини-демон для получения данных из удаленного сокета. Удаленный сервер - это сервер Asterisk VoIP, и я буду подключаться к интерфейсу управления Asterisk (AMI) в попытке получать уведомления о событиях AMI. Соединение будет осуществляться через постоянно включенный SSH-туннель (с использованием autossh), который до сих пор был достаточно стабильным для нашего использования.

Вот план ...

  • PHP-скрипт для подключения к локальному порту туннеля SSH, который перенаправляет на удаленный порт на другом конце, используя fsockopen() или, скорее всего, pfsockopen()
  • PHP-скрипт будет запускаться из CLI, и я полагаю, что у меня должен быть какой-то сценарий оболочки для задания cron, чтобы проверить, что PHP-скрипт не остановился по какой-либо причине
  • Мне понадобится, чтобы этот PHP-скрипт работал постоянно и постоянно подключался к сокету для получения данных, когда они публикуются другим концом
  • Память и ЦП не являются проблемой, поскольку у нас достаточно ресурсов на нашем сервере внутренней сети (преступно используется недостаточно), но в равной степени я не хочу, чтобы этот скрипт вышел из-под контроля
  • PHP-скрипт, как мы надеемся, будет реагировать на случайные данные, появляющиеся на другом конце сокета, и иногда вставлять или обновлять данные в базе данных MySQL. Очевидно, я буду открывать / закрывать соединение MySQL при необходимости, а не просто оставлять его зависшим.

Прежде всего, это ужасная идея, которая никогда не сработает?

Я понимаю, что PHP, вероятно, не самый лучший язык для такого маленького демона, как этот, но я уже имел успех с PHP на CLI, и этот язык мне наиболее удобен в наши дни.

Существуют ли какие-либо функции PHP, которые могут вступить в действие при публикации данных на другом конце сокета?
Или я бы просто зациклился, используя fread() вот так ...

while (!feof($socket)) {
$output .= fread($socket, 8192);
}

Параметр цикла кажется немного беспорядочным, поэтому мне просто интересно, есть ли другой способ, который будет означать, что скрипт остается подключенным к сокету, но в основном простаивает, пока не появятся некоторые данные.

Какие минусы / подводные камни я должен знать, думая о подключении постоянно работающего PHP-скрипта к сокету?

Приветствия, B

Ответы [ 2 ]

1 голос
/ 28 октября 2011

Посмотрите на ZeroMQ, асинхронную библиотеку сообщений. http://en.wikipedia.org/wiki/ZeroMQ

Вот ссылка на php-привязки:

http://www.zeromq.org/bindings:php

1 голос
/ 28 октября 2011
  • вы должны знать о потреблении памяти при написании PHP-демона. Если не полностью отключить () / free () d, ваш демон со временем может потреблять все больше и больше памяти.

  • как вы уже сказали, PHP не лучший язык для этого, но он определенно будет работать. я уже делал это "взломать" несколько раз.

  • Имейте в виду, что fread () на сокете TCP будет неблокирующим. Поскольку каждая строка завершается CR / LF (\ r \ n), а два CR / LF отмечают конец события / команды AMI, вы можете прочитать до тех пор, пока не произойдет «\ r \ n \ r \ n», а затем обработать событие, а затем начать читать снова. Я бы установил блокировку сокета и использовал бы fgets () вместо fread (). таким образом, намного легче обнаружить конец события AMI - без необходимости выполнять магию / разбиение строки.

...