Asterisk agi php

Cum se instalează PHP pentru a lucra cu Asterisk Gateway Interface (AGI)

Prima regulă de afaceri este să fii conștient de mediul PHP. Nu spun că trebuie să schimbi ceva, dar trebuie să fii conștient de asta, poate o disperare, mai ales când ești în grosul lucrurilor. Pe Debian, este posibil să aveți imediat nevoie de "php4-cli", deoarece PHP4 tipic php este doar pentru rețea.








În cele din urmă am reușit să găsesc o problemă cu scriptul meu PHP AGI! Probabil, au existat 2 versiuni de PHP instalate pe mașina mea. Unul pentru CGI și unul pentru CLI. Nu se stie cum de a testa script-ul meu, am vyzsval versiune a CLI (/ usr / local / bin / php), în ciuda faptului că versiunea PHP numit CLI (/ usr / local / bin / php). Sa întors astfel încât scriptul meu să nu ruleze pe versiunea CLI a PHP ... Mă întreb, nu-i așa?

Uitați-vă la fișierul dvs. de configurare php (în /etc/php.ini sau /usr/local/etc/php.ini) pentru următoarele:

ob_implicit_flush (fals);
set_time_limit (5);
; error_log = numele fișierului
error_reporting (0); // încărcat de: democritus

Prima linie, ob_implicit_flush -, indică dacă php ar trebui să tamponeze ieșirea; în cazul AGI Asterisk, dacă vă bufferizuete ieșire, Asterisk nu vor primi echipele pentru o lungă perioadă de timp, până când ștergeți tampon manual (a se vedea mai jos)

Al doilea element, set_time_limit. acesta este timpul maxim posibil pentru a executa scriptul php. Cele mai multe script-uri de agitație Asterisk vor fi difuzate fără un timp rezonabil, dar dacă aveți un script foarte lung care generează erori neobișnuite, este posibil ca scenariul dvs. să fi fost terminat prematur.

Al treilea element este error_log; important pentru depanare, dar un criminal pentru sistemele industriale. Poate fi oprită în mod prestabilit sau puteți să o dezactivați intenționat și să nu uitați.

Al patrulea element este error_repоrting (0). spune PHP să nu raporteze erori în timpul duratei de execuție a scriptului. Acest lucru este important deoarece toate erorile (și unele avertismente) pe care le-a creat scriptul dvs. vor fi trimise către STDOUT, același buffer la care sunt trimise toate comenzile AGI. Prin urmare, orice erori din scriptul dvs. vor fi trimise la AGI și astreiskul va încerca să le citească ca o comandă AGI. În experimentul meu, acest comportament va executa toate comenzile ulterioare, după ce eroarea de script (necunoscută pentru tine) returnează "Comanda nevalidă 510" ...
după o eroare de script (necunoscut pentru tine), întoarcerea „510 de comandă nevalid“, deși comenzi ca „EXEC Redarea“ va reda de fapt încă un fișier de sunet. Pentru importante AGI comenzi cum ar fi „GET DATE my_file“ și „GET my_file DIGIT“, asteriscul CLI va raporta „Playing my_file File“, dar fișierul de sunet nu se va auzi pe canal și nu de intrare DTMF pot fi recepționate de către apelant. Există, de asemenea, nici un fel de script-ul pentru a arăta ce taste DTMF au fost presate, deoarece comanda returnează un „510„șir de caractere invalid. O alternativă la utilizarea error_reporting (0) la începutul script-ul dvs. pentru a vă ajuta la depanarea ar fi să prefixului suspectate dvs. comenzile generatoare de erori în scriptul dvs. cu @, cum ar fi







$ rst = @mysql_query ($ strSQL);
SAU
$ fp = @fopen ("unele fișiere inexistente", "r");

@ Va suprima orice eroare sau instrucțiuni.
edita

Puneți-vă script-urile în directorul / var / lib / asterisk / agi-bin / și încercați să le lucrați înainte de a vă imagina ceva.

3. Executați permisiunile pentru fișierele de script

Amintiți-vă să cântați TOATE scenariile dvs. la 733, după cum se arată mai jos:

4. Interfața pentru comanda shell

Primele două rânduri din scriptul dvs. ar trebui să fie următoarele (presupunând că legătura dvs. php se află în / usr / bin; verificați-o dublu):

Apoi, trebuie să utilizați fopen () pentru a crea toți descriptorii necesari. Știu că multe versiuni de php s-au schimbat semne pentru a gestiona fluxurile stdio, dar fopen () va lucra cu majoritatea versiunilor noi și vechi, face scripturile mai portabil, iar fișierul php.ini nu vă dau probleme. În plus, fopen () nu reprezintă un inconvenient pentru utilizarea cu * agi, deci folosiți-l.

Notă. STDOUT este deja deschis în interiorul php 4.3.0 și mai sus, astfel încât să puteți face fwrite (STDOUT, "blah");

6. Manipulați cu intrarea în mediul Asterisk

Asterisk trimite întotdeauna un fascicul în fiecare clipă la agi, numit după cum se arată mai jos:

agi_request: test.php
agi_channel: Zap / 1-1
agi_language: ro
agi_type: Zap
agi_callerid:
agi_dnid:
agi_context: implicit
agi_extension: 1000
agi_priority: 1

Salvați informațiile cu această funcție (sau exemplul de mai jos):


în timp ce (! feof ($ stdin)) $ temp = fgets ($ stdin);
$ temp = str_replace ("\ n", "", $ temp);
$ s = exploda (":", $ temp);
$ agivar [$ s [0]] = trim ($ s [1]);
dacă ($ temp == "") || ($ temp == "\ n")) pauză;
>
>

Pentru a utiliza o variabilă simplă și un apel cheie ... de exemplu. Dacă doriți ca apelantul să folosească pur și simplu variabila $ agivar [agi_extension] din codul dvs. PHP ...

Alte antete AGI mutate de Asterisk (intrări de mediu)

• agi_calleridname - Numele apelantului, de exemplu, Joe Soap
• agi_callingpres - Reprezentare pentru canal în canalul ZAP
• agi_callingani2 - necunoscut
• agi_callington - necunoscut
• agi_callingtns - necunoscut
• agi_dnid - numărul de identificare format
• agi_rdnis - Numărul trimis de DNIS
• agi_enhanced - Valoarea semnalizatorului este 1.0 dacă începe ca un script EAGI

Notă. dacă numărul de identificare al apelantului nu este setat la sip.conf, agi_callerid va avea aceeași valoare ca agi_calleridname.

7. Începerea utilizării canalului AGI

Acesta este punctul în care puteți începe o conversație cu un asterisc. Folosiți butoanele pentru a trimite * comenzi agi. De asemenea, puteți utiliza comanda ecou.

fputs ($ stdout, "SAY NUMBER 1234567 '79 # '\ n");
fflush ($ stdout);

• Notă: Utilizați fflush () indiferent de setarea php.ini doar pentru a fi siguri. Dacă nu faceți fflush () (automat sau manual), Asterisk nu va accepta comanda și programul dvs. va rămâne acolo până la expirarea timpului.







Articole similare

Trimiteți-le prietenilor: