Signatur
Beschreibung
pclose() schließt einen Prozess-Dateizeiger, der zuvor mit popen() geöffnet wurde. Die Funktion wartet, bis der zugehörige Prozess beendet ist, und gibt dessen Exit-Status zurück. Sie ist das Pendant zu fclose() für normale Dateizeiger, jedoch speziell für Prozess-Pipes gedacht.
Der Rückgabewert entspricht dem Beendigungsstatus des Prozesses. Ein Wert von 0 signalisiert in der Regel einen erfolgreichen Abschluss, während andere Werte auf Fehler oder bestimmte Zustände hinweisen können. Auf Systemen, auf denen wait4() verfügbar ist, werden zusätzliche Informationen zu Unterabläufen erfasst.
pclose() ist sinnvoll, wenn externe Programme über eine Pipe aufgerufen werden und der Exit-Code des Prozesses für weitere Entscheidungen im PHP-Script benötigt wird, z. B. um zu prüfen, ob ein Shell-Befehl erfolgreich ausgeführt wurde.
Es ist wichtig, jeden mit popen() geöffneten Handle auch mit pclose() zu schließen, da andernfalls Prozesse als Zombie-Prozesse im System verbleiben können und Ressourcen belegen.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $handle Pflicht | resource | Der Prozess-Dateizeiger, der mit popen() geöffnet wurde und nun geschlossen werden soll. |
Rückgabewert
-1 wird zurückgegeben, wenn ein Fehler auftritt. Ein Rückgabewert von 0 steht typischerweise für einen erfolgreichen Abschluss des Prozesses.Beispiele
Einfaches Ausführen eines Befehls und Prüfen des Exit-Status
<?php
$handle = popen('ls /tmp', 'r');
if ($handle === false) {
echo 'Fehler beim Öffnen des Prozesses.' . PHP_EOL;
exit(1);
}
// Ausgabe des Befehls lesen
while (!feof($handle)) {
echo fgets($handle);
}
$exitCode = pclose($handle);
if ($exitCode === 0) {
echo 'Prozess erfolgreich beendet.' . PHP_EOL;
} else {
echo 'Prozess mit Exit-Code ' . $exitCode . ' beendet.' . PHP_EOL;
}
Prüfen ob ein Programm vorhanden ist über Exit-Code
<?php
// Prüfen ob 'git' im System verfügbar ist
$handle = popen('git --version 2>&1', 'r');
if ($handle === false) {
echo 'Konnte Prozess nicht starten.' . PHP_EOL;
exit(1);
}
$output = fgets($handle);
$exitCode = pclose($handle);
if ($exitCode === 0) {
echo 'Git ist installiert: ' . trim($output) . PHP_EOL;
} else {
echo 'Git wurde nicht gefunden (Exit-Code: ' . $exitCode . ').' . PHP_EOL;
}
// Wichtig · Fallstricke
Sicherheitshinweis: Werden Benutzereingaben in den Befehl eingebunden, der an popen() übergeben wird, muss zwingend escapeshellcmd() bzw. escapeshellarg() verwendet werden, um Command-Injection-Angriffe zu verhindern.
Der Rückgabewert von pclose() hängt vom Betriebssystem ab. Unter Windows kann das Verhalten abweichen. Auf POSIX-Systemen entspricht der Wert dem Rückgabewert von waitpid().
Ressourcenverwaltung: Jeder mit popen() geöffnete Handle sollte immer mit pclose() geschlossen werden — auch wenn der Prozess selbst schon beendet ist —, um Ressourcenlecks und Zombie-Prozesse zu vermeiden.