AGI + PHP sofort weiter im Dialplan

dalepbx

Neuer User
Mitglied seit
24 Feb 2010
Beiträge
9
Punkte für Reaktionen
0
Punkte
0
Hi,

ich bin momentan am verzweifeln mit meinem Asterisk 1.4.29, PHP 5.2.6-1 und AGI.

Ich möchte, dass mein per AGI aufgerufenes PHP-Skript, wegen seiner Laufzeit von ca. 10 sec, "asynchron" ausgeführt wird. D.h. Es soll direkt nach dem Starten des Skripts im Wählplan weitergemacht werden.

Die "best practice" hierzu ist (in Perl) auf voip-info.org beschrieben.

Daraufhin habe ich folgendes Skript erstellt:

PHP:
#!/usr/bin/php -q
<?php
$pid = pcntl_fork();
if ($pid == -1) {
        die('Unable to fork');
} else if ($pid) {
        #Parent
        fwrite(STDOUT, "\n");
        exit();
} else {
        #Child

        #...
        sleep(10);
        #...
}
?>

Das Skript wird folgendermassen aufgerufen:

Code:
exten => 123,2,AGI(sendnum.php,${CALLERID(num)},124,125,126)

Leider bleibt so mein Wählplan 10 Sekunden hängen :confused: obwohl, meiner und der "allgemeinen Internet-Meinung" nach, der Kindprozess durch den Fork unabhängig von Asterisk laufen sollte.

Das muss doch schon mal jemand gemacht haben... Bin für jeden Tipp dankbar!
 
Zuletzt bearbeitet:
Hallo dalepbx,

ich bin daran auch vor kurzem gescheitert, und hab's dann notgedrungen mit

PHP:
exec("/usr/bin/php zweites-skript.php 2>/dev/null >&- < &- >/dev/null &");

gemacht. Vielleicht hilft Dir das, ich war davon nicht begeistert und hab den ganzen Ablauf dann anders gelöst.

Rentier
 
Danke für deine Antwort, daraufhin hab ich mich auch nach einer anderen Lösung umgesehen.

Ich hab jetzt ein standalone PHP-Programm welches per named pipe Anweisungen entgegen nimmt. Im Dialplan setzte ich diese Anweisungen dann per

Code:
exten => 123,1,System(echo n ${CALLERID(num)} 124 125 126> /var/run/sendnum &)

ab. /var/run/sendnum ist die named pipe. Im externen PHP-Script wird dann auf den Displays der Telefone 124 125 und 126 (snom 320) für ein paar Sekunden die Nummer, welche die 123 angerufen hat angezeigt. Also ein "erweitertes BLF" bei dem man auch die Nummer dessen sieht, der die "überwachte" Nebenstelle anruft.

Die Nachricht bekommt man übrigens mittels

Code:
http://admin:PASSWORD@SNOM_IP/dummy.htm?settings=save&user_idle_text1=IRGENDWAS

auf das snom-display.
 
Hi,

der Child erbt bei fork(2) u.a. auch die filehandles, und auf das "ende" von STDIN (aus Sicht sendnum) wartet AGI() evtl?

Probier mal im else ein 'fclose(STDIN);' unter #Child.
 
Hallo Philipp,

ohne fork hilft weder fclose(STDIN); noch fclose(STDOUT); weiter. Ge-fork-t habe ich nicht ausprobiert.

Rentier
 
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.