Як встановити PHP для роботи з Asterisk Gateway Interface (AGI)
Перше правило бізнесу - бути обізнаним про середовищі PHP. Я НЕ кажу, що ви повинні змінити щось, але ви повинні бути обізнаними про неї, можливо деякий розпач, особливо коли ви в гущі речей. На Debian вам відразу можливо треба отримати "php4-cli", так як типова усіановка PHP4 призначається тільки для мережі.
Я нарешті спромігся знайти проблему з моїм PHP AGI скриптом! Ймовірно, на моїй машині було 2 версії встановлених PHP. Одна для CGI і інша для CLI. Не знаючи, як провести тестування мого скрипта, я визsвал версію CLI (/ usr / local / bin / php), незважаючи на те, що PHP викликав версію CLI (/ usr / local / bin / php). Це обернулося так, що мій скрипт НЕ буде запускатися на CLI версії PHP ... Цікаво, чи не так?
Подивіться на ваш php конфиг файл (в /etc/php.ini або /usr/local/etc/php.ini) для наступного:
ob_implicit_flush (false);
set_time_limit (5);
; error_log = filename
error_reporting (0); // додано користувачем: Демокріт
Перший рядок, ob_implicit_flush -, показує, чи повинен php буферизувати вихідні дані; в разі Asterisk agi, якщо ви буфферізуете вихідні дані, Астеріск АТС не отримає ваші команди довгий час, до тих пір поки ви не очистите ваш буфер вручну (дивись нижче)
Другий елемент, set_time_limit. це максимально можливий час для виконання вашого php скрипта. Більшість Asterisk agi скриптів будуть запускатися без розумного часу, але якщо у вас є дуже довгий скрипт, який виробляє незвичайні помилки, можливо, що ваш скрипт був завершений передчасно.
Третій елемент - error_log; важливий для налагодження, але вбивця для промислових систем. Він може бути вимкнений за замовчуванням або ви можете навмисно виключити його і не забути.
Четвертий елемент, error_repоrting (0). каже PHP не повідомляти про помилки в плині часу виконання скрипта. Це важливо, тому що будь-які помилки (і деякі попередження), які створив ваш скрипт, будуть послані до STDOUT, того ж самого буферу, до якого посилаються всі AGI команди. Тому, будь-які помилки в вашому скрипті будуть послані до AGI і астреіск намагатиметься прочитати їх як AGI команди. У моєму експерименті, це поведінка буде виконувати всі наступні команди, після того, як помилка скрипта (невідома для вас) поверне "510 invalid command" ...
after a script error (unknown to you), return '510 invalid command', although commands like 'EXEC Playback' will actually still play back a sound file. For important AGI commands like 'GET DATA my_file' and 'GET DIGIT my_file', the Asterisk CLI will report "Playing File my_file" but the sound file will not be heard on the channel and no DTMF input can be received by the caller. There is also no way for the script to tell what DTMF keys were pressed since the command returns a "510 invalid 'string. An alternative to using error_reporting (0) at the beginning of your script to help you debug would be to prepend your suspected error-generating commands in your script with @, such as
$ Rst = @mysql_query ($ strSQL);
OR
$ Fp = @fopen ( "some non-existant file", "r");
The @ will suppress any errors or warning generated by the statement.
Edit
Помістіть ваші скрипти в ДИРЕТОР / var / lib / asterisk / agi-bin / і отримаєте їх роботу спершу перед тим, як ви що-небудь уявіть.
3.Виполненіе дозволу на файлів скрипта
Пам'ятайте до chmod ВСЕ ваші скрипти до 733 як нижче показано:
4. Інтерфейс для команди shell
2 перші рядки в вашому скрипті повинні бути наступні (за умови що ваша php bindery знаходиться в / usr / bin; двічі перевірте це):
Далі, ви повинні використовувати fopen () для створення всіх необхідних дескрипторів. Я знаю, що багато версій php мають змінені ознаки для того, щоб звертатися з потоками stdio, але fopen () буде працювати з більшістю нових і старих версій, що роблять ваші скрипти більш портативними, і файл php.ini не доставляє вам неприємності. Крім того, fopen () не представляє незручності для використання з * agi, тому використовуйте його.
Зауваження. STDOUT вже відкрито всередині php 4.3.0 і вище, тому можна робити fwrite (STDOUT, "blah");
6. Handle введення середовища Астеріск
Asterisk завжди відсилає пучок в кожен момент часу до agi, що викликається як показано нижче:
agi_request: test.php
agi_channel: Zap / 1-1
agi_language: en
agi_type: Zap
agi_callerid:
agi_dnid:
agi_context: default
agi_extension 1000
agi_priority: 1
Збережіть інфу з цією функцією (або приклад нижче):
while (! feof ($ stdin)) $ temp = fgets ($ stdin);
$ Temp = str_replace ( "\ n", "", $ temp);
$ S = explode ( ":", $ temp);
$ Agivar [$ s [0]] = trim ($ s [1]);
if (($ temp == "") || ($ temp == "\ n")) break;
>
>
Для використання простого виклику змінної і ключа ... наприклад. Якщо ви хочете, щоб викликає номер просто використовував змінну $ agivar [agi_extension] в вашому PHP коді ...
Інші AGI заголовки, прермещенние Астеріск (входи середовища)
• agi_calleridname - Ім'я викликає, наприклад, Joe Soap
• agi_callingpres - Вистава для callerid в ZAP каналі
• agi_callingani2 - невідомо
• agi_callington - невідомо
• agi_callingtns - невідомо
• agi_dnid - id номер dialed
• agi_rdnis - Послане DNIS число
• agi_enhanced - Значення прапора - 1.0, якщо стартує як EAGI скрипт
Зауваження. якщо id номер викликає не встановлено в sip.conf, agi_callerid матиме те саме значення, що і agi_calleridname.
7. Початок використання AGI каналу
Це точка, де ви можете почати розмову з Астеріск. Використовуйте fputs для того, щоб відправити * agi команди. Ви можете також використовувати echo команду.
fputs ($ stdout, "SAY NUMBER 1234567 '79 # '\ n");
fflush ($ stdout);
• Зауваження: Використовуйте fflush () regardless of php.ini setting just to be safe. If you do not fflush () (авто або вручну), Asterisk не братиме команду і ваша прога буде stuck там до таймаута.