Start · Sprachen · PHP · Referenz · pclose

pclose

Funktion

Schließt einen mit <code>popen()</code> geöffneten Prozess-Dateizeiger und gibt den Exit-Status des Prozesses zurück.

seit PHP 4.0.0 Kategorie: io

Signatur

pclose(resource $handle): int

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

Typ
int
Beschreibung
Gibt den Exit-Status des geschlossenen Prozesses zurück. -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;
}
(Inhalt von /tmp) Prozess erfolgreich beendet.

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;
}
Git ist installiert: git version 2.39.0

// 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.