2013-04-13 3 views

Antwort

7

das zweite Beispiel in der Dokumentation Prüfen auf popen, es zeigt genau, wie das tun:

<?php 
error_reporting(E_ALL); 

/* Add redirection so we can get stderr. */ 
$handle = popen('/path/to/executable 2>&1', 'r'); 
echo "'$handle'; " . gettype($handle) . "\n"; 
$read = fread($handle, 2096); 
echo $read; 
pclose($handle); 

Diese Snippet liest von stderr. Entfernen Sie die Pipe, um von stdout zu lesen.

3

Sie können das Echo-Ergebnis auf der Konsole nicht sehen, weil es nie zur Konsole gegangen ist. Durch Öffnen des Prozesses im Lesemodus wurde sein STDOUT mit dem Dateihandle des geöffneten Prozesses verknüpft. Die Ausgabe würde nur dann zur Konsole gelangen, wenn Sie von diesem Datei-Handle lesen und es dann wiederholen.

Der Fluss, mit anderen Worten, ist dies.

  • b.php laufen beginnt - seine STDIN und STDOPUT wie gewohnt mit Ihrer Konsole verbunden
  • ruft popen im Lesemodus und speichert den Strom Ressource in $ h
  • dies bewirkt, dass a.php anfangen zu laufen , da STDOUT mit dem Dateideskriptor in $ h verbunden ist und STDIN nicht mit irgendwas verknüpft ist, bedeutet dies, dass a.php keinen direkten Zugriff auf die Konsole hat, von der b.php gestartet wurde
  • a.php schreibt seine Ausgabe in diesen Stream und beendet dann die Ausführung
  • b.php macht nie etwas mit dem Stream in $ h, es schließt nur, so dass die Ausgabe von a.php verloren geht.

Hoffnung, die erklärt, was hier vor sich geht. Wenn Sie die Ausgabe von a.php auf der Konsole sehen wollen, dann muss b.php es aus dem Stream in $ h lesen und dann zurücksenden, da nur b.php Zugriff auf die Konsole hat. Wenn Sie system() anstelle von popen() verwenden, wird die Ausgabe automatisch auf der Konsole des aufrufenden Skripts ausgegeben, da system() die STDIN und STOUT des Hauptskripts an das Programm oder Skript übergibt, das Sie verwenden Anruf.