Start · Sprachen · PHP · Referenz · exec

exec

Funktion

Führt ein externes Programm aus und gibt die letzte Zeile der Ausgabe zurück.

seit PHP 4.0.0 Kategorie: misc

Signatur

exec(string $command, array &$output = null, int &$result_code = null): string|false

Beschreibung

exec() führt den angegebenen Befehl in der Systemshell aus. Im Gegensatz zu shell_exec() gibt exec() nur die letzte Zeile der Programmausgabe als Zeichenkette zurück. Soll die vollständige Ausgabe erfasst werden, kann der optionale Parameter $output übergeben werden, der dann als Array befüllt wird, wobei jede Zeile ein eigenes Element ist.

Der optionale Parameter $result_code wird mit dem Exit-Status des aufgerufenen Prozesses befüllt (0 steht üblicherweise für Erfolg, alles andere für Fehler). Diese Information ist besonders nützlich, um zu prüfen, ob der externe Befehl erfolgreich abgeschlossen wurde.

exec() ist dann sinnvoll, wenn man externe Tools oder Shell-Kommandos aus PHP heraus aufrufen möchte — etwa zum Starten von Konverter-Programmen, Komprimierungstools oder Systembefehlen. Für einfache Ausgaben ohne Rückkehrstatus eignet sich alternativ shell_exec(), für bidirektionale Kommunikation mit einem Prozess proc_open().

Sicherheitshinweis: Benutzereingaben dürfen niemals ungeprüft in den Befehl eingebettet werden. Alle externen Daten müssen zuvor mit escapeshellarg() oder escapeshellcmd() abgesichert werden, um Command-Injection-Angriffe zu verhindern.

Parameter

Name Typ Default Beschreibung
$command Pflicht string Der auszuführende Shell-Befehl. Kann absolute oder relative Pfade sowie Argumente enthalten. Benutzereingaben müssen vorher mit escapeshellarg() gesichert werden.
$output array null Wird dieser Parameter übergeben, wird er mit den Ausgabezeilen des Befehls befüllt. Jede Zeile der Standardausgabe (stdout) erscheint als eigenes Array-Element. Bestehende Inhalte des Arrays werden nicht überschrieben, sondern neue Elemente werden angehängt.
$result_code int null Wird dieser Parameter übergeben, enthält er nach dem Aufruf den Exit-Status-Code des ausgeführten Prozesses. Ein Wert von 0 bedeutet üblicherweise Erfolg.

Rückgabewert

Typ
string|false
Beschreibung
Gibt die letzte Zeile der Ausgabe des Befehls als Zeichenkette zurück. Gibt es keine Ausgabe, wird eine leere Zeichenkette zurückgegeben. Bei einem Fehler (z. B. wenn der Befehl nicht gefunden wird oder die Funktion deaktiviert ist) gibt exec() false zurück.

Beispiele

Einfachen Systembefehl ausführen und Exit-Code prüfen

<?php
$lastLine = exec('ls -la /tmp', $output, $exitCode);

echo 'Exit-Code: ' . $exitCode . PHP_EOL;
echo 'Letzte Zeile: ' . $lastLine . PHP_EOL;
echo 'Alle Zeilen:' . PHP_EOL;
foreach ($output as $line) {
    echo $line . PHP_EOL;
}
Exit-Code: 0 Letzte Zeile: -rw-r--r-- 1 www-data www-data 0 Jun 10 12:00 example.txt Alle Zeilen: total 0 -rw-r--r-- 1 www-data www-data 0 Jun 10 12:00 example.txt

Benutzereingabe sicher als Argument übergeben

<?php
// Unsichere Benutzereingabe (z. B. aus $_GET)
$userInput = $_GET['filename'] ?? 'test.txt';

// Eingabe absichern!
$safeArg = escapeshellarg($userInput);

$result = exec('file ' . $safeArg, $output, $exitCode);

if ($exitCode === 0) {
    echo 'Dateityp: ' . $result . PHP_EOL;
} else {
    echo 'Fehler beim Ausführen des Befehls.' . PHP_EOL;
}
Dateityp: test.txt: ASCII text

Bildkonvertierung mit ImageMagick

<?php
$inputFile  = escapeshellarg('/var/www/uploads/foto.jpg');
$outputFile = escapeshellarg('/var/www/uploads/foto_thumb.jpg');

exec('convert ' . $inputFile . ' -resize 200x200 ' . $outputFile, $output, $exitCode);

if ($exitCode === 0) {
    echo 'Thumbnail erfolgreich erstellt.' . PHP_EOL;
} else {
    echo 'Fehler bei der Konvertierung: ' . implode("\n", $output) . PHP_EOL;
}
Thumbnail erfolgreich erstellt.

// Wichtig · Fallstricke

Sicherheit (Command Injection): Das Einbetten von Benutzereingaben ohne Absicherung in Shell-Befehle ist eine der gefährlichsten Schwachstellen in PHP-Anwendungen. Verwende immer escapeshellarg() für einzelne Argumente und escapeshellcmd() für den gesamten Befehl, wenn Teile davon aus unsicheren Quellen stammen.

Safe Mode / Deaktivierung: In produktiven Umgebungen kann exec() über die PHP-Direktive disable_functions in der php.ini deaktiviert sein. Prüfe dies, wenn die Funktion unerwartet nicht verfügbar ist.

Stderr: exec() erfasst standardmäßig nur die Standardausgabe (stdout). Fehlermeldungen (stderr) werden nicht automatisch in $output geschrieben. Um stderr ebenfalls zu erfassen, kann man im Befehl 2>&1 anhängen oder proc_open() verwenden.

Hintergrundprozesse: Soll ein Prozess im Hintergrund gestartet werden, ohne auf seine Beendigung zu warten, kann der Befehl unter Unix mit einem abschließenden & und Umleitung der Ausgabe versehen werden, z. B. nohup ./script.sh >/dev/null 2>&1 &.