Systemkommandos und der Output

Post von realloc | Einsortiert in Code am 22. August 2007 | Keine Kommentare

Schaut man sich mal das vorhandene PHP-Funktionsset für die Ausführung von Programmen auf dem verwendeten Server an, wird man feststellen, dass da so einiges angeboten wird, das seinen Sinn nicht sofort offenbart. Einige Commands stehen im safe mode nicht zur Verfügung, andere liefern nur die letzte Zeile der Ausgabe usw. Für den Fall, dass man die komplette Ausgabe benötigt, wird auf passthru verwiesen. Dummerweise wird der Rückgabetyp von passthru aber mit void bezeichnet, was die Befürchtung, dass diese Daten sofort in den Ausgabestrom geschrieben werden, zur Gewissheit werden lässt.

Allerdings kann man dieses Verhalten auch unterbinden, indem man die Ausgabe einfach puffert:

[code lang="php"]
ob_start ();
passthru ("/bin/ls -la");
$var = ob_get_contents ();
ob_end_clean ();
[/code]

Bei der Verwendung von passthru muss darauf geachtet werden, das komplette Pfadangaben verwendet werden, weil die Ausführung nicht durch die Shell stattfindet und die Umgebungsvariablen deshalb nicht zur Verfügung stehen. Will man die Rückgabe später doch noch verwenden und außerdem sicher sein, das der Befehl erfolgreich war, bietet sich der optionale Parameter von passthru an, wie in folgendem Beispiel aufgeführt wird:

[code lang="php"]
ob_start ();
passthru ("/bin/ls -la", $success);
$var = ob_get_contents ();
ob_end_clean ();

if (!$success) print_r ($var);
[/code]

Unix-Programme liefern bei Erfolg traditionsgemäß 0 und bei einem Fehler einen Wert zwischen 1 und 256. Dies sollte im Einzelfall jedoch geprüft werden. Beispielsweise liefert grep bei Erfolg 0, falls das Muster nicht gefunden wurde 1 und ansonsten 2 zurück.

Falls sich jemand über die seltsame Konstruktion mit print_r wundert … diese Funktion verfügt bereits über eine eingebaute Pufferung. Dabei fällt mir auf, das der Artikel schon fast in die Meckerecke passt.

Have fun!

Möglicherweise interessiert Dich auch...



Einen Kommentar schreiben