Signatur
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
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;
}
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;
}
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;
}
// 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 &.