$weatherPage)) $currentWindDirection='southeasterly';
Направление ветра извлекаем посредством команды preg_match, а полученное значение (заключенное в теги wind_dir) присваиваем переменной $currentWindDirection.
# получаем скорость ветра
if (preg_match('/<wind_mph>([0-9.]+)</wind_mph>/i',$weatherPage,$matches)) {
$currentWindSpeed = $matches[1];
}
Наконец получаем текущую скорость ветра и присваиваем ее значение переменной $currentWindSpeed.
# сообщить вызывающему абоненту текущие погодные условия
if ($currentTemp) {
fwrite(STDOUT,'STREAM FILE temperature '' '); fflush(STDOUT);
$result = trim(fgets(STDIN,4096)); checkresult($result); fwrite(STDOUT,'STREAM FILE is '' '); fflush (STDOUT);
$result = trim(fgets(STDIN,4096));
checkresult($result);
fwrite(STDOUT,'SAY NUMBER $currentTemp '' '); fflush(STDOUT);
$result = trim(fgets(STDIN,4096)); checkresult($result);
fwrite(STDOUT,'STREAM FILE degrees '' '); fflush(STDOUT);
$result = trim(fgets(STDIN,4096)); checkresult($result);
fwrite(STDOUT,'STREAM FILE fahrenheit '' '); fflush(STDOUT);
$result = trim(fgets(STDIN,4096)); checkresult($result);
}
if ($currentWindDirection && $currentWindSpeed) {
fwrite(STDOUT,'STREAM FILE with '' '); fflush(STDOUT);
$result = trim(fgets(STDIN,4096)); checkresult($result);
fwrite(STDOUT,'STREAM FILE $currentWindDirection '' '); fflush(STDOUT);
$result = trim(fgets(STDIN,4096)); checkresult($result);
fwrite(STDOUT,'STREAM FILE wx/winds '' '); fflush(STDOUT);
$result = trim(fgets(STDIN,4096)); checkresult($result); fwrite(STDOUT,'STREAM FILE at '' ';) fflush (STDOUT);
$result = trim(fgets(STDIN,4096)); checkresult($result);
fwrite(STDOUT,'SAY NUMBER $currentWindSpeed '' '); fflush(STDOUT);
$result = trim(fgets(STDIN,4096)); checkresult($result);
fwrite($STDOUT,'STREAM FILE miles-per-hour '' '); fflush(STDOUT);
$result = trim(fgets(STDIN,4096)); checkresult($result);
}
Теперь, собрав все необходимые данные, можно отправить AGI-коман- ды в Asterisk (проверяя результаты по ходу), которые доставят информацию о текущих погодных условиях вызывающему абоненту. Это будет реализовано с помощью AGI-команд STREAM FILE и SAY NUMBER. Мы говорили об этом раньше, повторим еще раз: при вызове команд AGI в них должны передаваться все необходимые аргументы. В данном случае обе команды, STREAM FILE и SAY NUMBER, требуют второго аргумента. Передадим пустые кавычки, экранированные символом обратного слэша.
Также следует обратить внимание, что при каждой записи в STDOUT вызывается команда fflush. Вероятно, это лишнее, но не будет вреда в том, чтобы гарантировать немедленную отправку AGI-команды в Asterisk, без буферизации.
function checkresult($res) {
trim($res);
if (preg_match('/'200/',$res)) {
if (! preg_match('/result=(-?d+)/',$res,$matches)) {
fwrite(STDERR,'FAIL ($res) ');
fflush(STDERR);
return 0;
}
else {
fwrite(STDERR,'PASS ('.$matches[1].') ');
fflush(STDERR);
return $matches[1];
}
}
else {
fwrite(STDERR,'FAIL (unexpected result '$res') ');
fflush(STDERR);
return -1;
}
}
Назначение функции checkresult аналогично подпрограмме checkresult из нашего примера на Perl. Как следует из ее имени, она проводит проверку
результатов, возвращаемых Asterisk, при каждом вызове команды AGI.
?>
В конце файла располагается закрывающий тег PHP. После закрывающего тега PHP не должно быть никаких пробелов, поскольку это может сбить с толку интерфейс AGI.
Теперь мы уже рассмотрели два разных языка программирования с целью продемонстрировать, что общего в написании сценария AGI на PHP и Perl и чем они отличаются. При создании сценария AGI на PHP помните, что необходимо:
• Запускать PHP с ключом -q; это отключает HTML в сообщениях об ошибках.
• Отключить ограничение по времени или задать для него приемлемое значение (более новые версии PHP автоматически отключают ограничение по времени при запуске PHP из командной строки).
• Отключить буферизацию вывода с помощью команды ob_implicit_ flush(false).
• Открыть описатели файла для STDIN, STDOUT и STDERR (в более новых версиях PHP один или более этих описателей файла уже могут быть открыты; в предыдущем фрагменте кода показано, как сделать это красиво для большинства версий PHP).
• Прочитать переменные из STDIN, используя функцию fgets.
• Использовать функцию fwrite для записи данных в STDOUT и STDERR.
• Всегда вызывать функцию fflush после записи в STDOUT или STDERR.
Библиотека AGI для PHP
Для более продвинутого программирования AGI на PHP, вероятно, пригодится проект PHPAGI, который можно найти по адресу
Написание сценариев AGI на Python
Сценарий AGI, который мы напишем на Python, называется «Игра в вычитание». Источником идей для его написания стала программа на Perl, созданная Эдом Гаем (Ed Guy) и представленная им на конференции AstriCon в 2004 году. Эд рассказывал, в какой восторг он пришел от мощи и простоты Asterisk, когда обнаружил, что может написать короткий сценарий на Perl, чтобы помочь своей дочери с математикой. Поскольку мы уже написали Perl-программу, использующую AGI и Эд создал свою математическую программу на Perl, мы решили заняться реализацией этой задачи на Python! Итак, разберем наш сценарий на Python: #!/usr/bin/python
Данная строка указывает системе выполнять этот сценарий в интерпретаторе Python. Для небольших