Возможно ли создать php callback на готовом входном потере? - PullRequest
0 голосов
/ 06 ноября 2019

У меня есть быстрое приложение AGI, которое зацикливается на некоторых сценариях. Разница в том, что при запуске канала локально запущенные сценарии AGI пропускают звёздочку.

В случае сетевого AGI, если канал зависает, продолжающий работу сценарий agi и циклы канала ожидают завершения этого сценария.

Когда канал зависает, звездочка отправляет сообщение «HANGUP» на стандартный вывод, но я использую синхронизирующий файл phpagi lib, который пропускает его. Итак, мой вопрос:

  1. Как bind готов прочитать событие stdin и вызвать функцию обратного вызова (которая обнаружит возможное зависание)?

  2. Как вернутьданные в stdin, если нет обнаружения зависания?

Сначала я пытаюсь найти простой способ решить эту проблему

Мой тестовый код выглядит следующим образом

while( 5 < 6)
 {
 $data = $agi->request;
 $chan = $data['agi_channel'];
 $agi->Verbose(print_r($chan,1));
 $res = $agi->exec('Wait','5');
 $agi->Verbose('res = '.print_r($res,1));
 $res = $agi->exec('Playback',$path);
 $agi->Verbose('res = '.print_r($res,1));
 $var = 'ret.'.time();
 $res = $agi-> exec('Read',$var.','.$path.','.$max);
 $agi->Verbose('res = '.print_r($res,1));
 unset($res);
   }

1 Ответ

0 голосов
/ 07 ноября 2019

Вы можете использовать функцию CHANNEL (состояние) запроса перед каждым циклом и проверять текущее состояние канала.

Если это не UP, значит у вас есть зависший канал.

Также такие действия, как Воспроизведение иRead вернет -1 (см. Внутреннюю документацию) в случае ошибки или зависания.

У вас нет опции для создания обратного вызова, если ваша структура синхронизирована. Используйте асинхронный каркас или потоки.

Если вы используете только AGI (не FastAGI), у вас также есть опция enable обработчик SIG_KILL. FastAGI работает через сокеты, поэтому никаких событий.

Другая опция - чтение AMIсобытия во втором потоке.

...