Kurze Frage zu PHP mit Bitte um kurze Antwort

betateilchen

Grandstream-Guru
Mitglied seit
30 Jun 2004
Beiträge
12,882
Punkte für Reaktionen
0
Punkte
0
Nach vielem Lesen auf voip-info.org und Suchen in Google bin ich immer noch ratlos.

Kann mir bitte jemand in 3 Sätzen versuchen zu erklären, wie ich aus Asterisk prinzipiell ein PHP Skript ausführen kann ?

Danke.
 
Grundsaetzlich kannst Du alles aus Asterisk heraus ausfuehren, wenn Du es als AGI-Skript auslegst:

exten => <Nummer>,<Prio>,AGI(meinphpscript.php)

Gesucht wird das Skript ueblicherweise in /var/lib/asterisk/agi-bin, Du kannst aber meines Wissens auch einen vollen Pfad angeben. Es sollte als ausfuehrbar gekennzeichnet sein (beispielsweise chmod a+x meinphpscript.php).

Das PHP-Skript muss dann als erste Zeile enthalten:
#!/pfad/zum/php-interpreter
Ggf. kannst Du noch Optionen hinten anhaengen.

Den Rest erklaert http://phpagi.sourceforge.net/, wo Du dann auch gleich noch eine Bibliothek findest, mit der das schreiben von AGI-Skripten mit PHP erleichtert wird.

hth.
 
Danke für die Antowrt.
Nun bin ich auch schon soweit, daß das Skript aus dem Dialplan heraus ausgeführt wird - allerdings "passiert nix" - d.h. das Skript wird mit "... return 0" beendet und das wars. Ich habe nirgendwo einen Log-Eintrag gefunden, in dem ich finden könnte, ob das Skript überhaupt irgendwas macht oder z.B. eine Fehlerausgabe produziert.

Naja - wird wohl noch einige Nächte Exprerimentierens brauchen.
 
hast du korrekt stdin & stdout geöffnet und die werte korrekt ausgelesen?
hier mal ein beispiel von meinem standard agi das ich verwende (die execute function is von mir.. wesentlich schlanker als so ne klasse)

Code:
#!/home/php/bin/php -q
<?php

function execute($command) {
	GLOBAL $in, $out;
	fputs($out, $command . " \n");
	fflush($out);
	$data = fgets($in, 4096);
	if (preg_match("°^([0-9]{1,3}) (.*)°", $data, $matches)) {
		if (preg_match('°^result=([0-9a-zA-Z]*)( ?\((.*)\))?$°', $matches[2], $match)) {
			$arr['code'] = $matches[1];
			$arr['result'] = $match[1];
			if (isset($match[3]) && $match[3])
				$arr['data'] = $match[3];
			return $arr;
		} else return 0;
	} else return -1;
}

ob_implicit_flush(true);
set_time_limit(0);
$out = fopen("php://stdout", "w");
$in = fopen("php://stdin", "r");
//$log = fopen("/tmp/agi.log", "w");
while (!feof($in)) {
	$temp = str_replace("\n","",fgets($in,4096));
	$s = split(":",$temp);
	if (!isset($s[1])) $s[1] = "";
	$agi[str_replace("agi_","",$s[0])] = trim($s[1]);
	if (($temp == "") || ($temp == "\n")) {
		break;
	}
}

execute("STREAM FILE whatever/whatever ''");

fclose($out);
fclose($in);
//fclose($log);
exit;

?>
 
Danke für die Antworten. Thema erledigt.
 
@ beta:

Ja, und wie? Durch die Tipps hier oder andere Lösung?
 
@beta

Was hast du denn nun damit realisiert?

(Ich denke, ich bin nicht der einzige, den das interessiert, oder?)
 
Die Loesung des Problems wird wohl der Tip gewesen sein, den fabe geposted hat. In einem AGI-Skript muss erst die Ausgabe von Asterisk lesen, bevor der erste Befehl ausgefuehrt wird (sprich: alles von stdin lesen). Nach jedem ausgefuehrten Befehl muss ebenfalls wieder stdin komplett gelesen werden. Nur dann funktioniert der Kram.
 
nein - ich habe ein völlig andere Lösung eingebaut. Ich wollte einfach was (für mein eigenes Netzwerk spezifisches) testen und es war letztendlich für mcih einfacher, eine eigene app in C zu programmieren als mich in dieses schwer durchschaubare AGI-Prinzip einzuarbeiten.

Wie gesagt - nix was für die Allgemeinheit von "Nutzen" wäre und bei mir ist das auch schon wieder raus - es war nur ein Test einer "sinnlosen" Anwendung :mrgreen:
 
@otaku

was ist an AGI schwer durchschaubar? Funktioniert vergleichbar zu CGI

genau - und CGI habe ich auch nie kapiert :mrgreen:
 
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.