is_executable()
Die Funktion is_executable() prüft, ob eine Datei existiert und vom aktuellen Prozess ausgeführt werden kann.
Was ist die Funktion is_executable()?
is_executable() ist eine eingebaute PHP-Funktion, die angibt, ob eine Datei existiert und als Programm ausgeführt werden kann vom aktuellen Prozess. Sie gibt true nur zurück, wenn beide Bedingungen erfüllt sind; andernfalls gibt sie false zurück.
„Ausführbar" bedeutet hier, dass das Betriebssystem das Ausführen der Datei erlaubt — zum Beispiel ein Shell-Skript, eine kompilierte Binärdatei oder eine .exe unter Windows. Eine normale Textdatei oder eine .php-Quelldatei ist normalerweise nicht ausführbar, auch wenn PHP sie lesen kann.
Diese Seite behandelt die Syntax, was der Rückgabewert wirklich bedeutet, wie sich die Prüfung zwischen Betriebssystemen unterscheidet, sowie die Fallstricke (Caching, fehlende Dateien, Berechtigungs-Bits), über die man leicht stolpert.
Syntax
is_executable(string $filename): bool| Parameter | Beschreibung |
|---|---|
$filename | Pfad zur zu prüfenden Datei. Kann relativ zum Arbeitsverzeichnis des Skripts oder ein absoluter Pfad sein. |
Rückgabewert — true, wenn die Datei existiert und ausführbar ist, false andernfalls. PHP gibt außerdem eine E_WARNING-Meldung aus, wenn der Pfad ungültig ist (zum Beispiel wenn ein Verzeichnis im Pfad nicht durchsucht werden kann).
Ein einfaches Beispiel
Die Funktion gibt einen boolean zurück, sodass sie sich direkt in eine if-Bedingung einfügt. Hier zeigen wir auf die PHP-Binärdatei; auf einem typischen Linux-Server ist dieser Pfad ausführbar und der erste Zweig wird ausgeführt. Der genaue Pfad variiert je nach System, weshalb das nächste Beispiel eine Datei erstellt, über die wir vollständige Kontrolle haben.
Eine Datei erstellen und testen
Die Prüfung ist am aussagekräftigsten, wenn man die Berechtigungs-Bits der Datei selbst kontrolliert. Das folgende Beispiel schreibt ein kleines Shell-Skript, markiert es mit chmod() als ausführbar und bestätigt das Ergebnis:
<?php
$script = sys_get_temp_dir() . '/hello.sh';
file_put_contents($script, "#!/bin/sh\necho hi\n");
// Before chmod: readable but not executable.
var_dump(is_executable($script)); // bool(false)
chmod($script, 0755); // owner rwx, group/other r-x
clearstatcache(); // forget the cached result
var_dump(is_executable($script)); // bool(true)
unlink($script);Zwei Dinge sind zu beachten:
- Die Datei ist nicht ausführbar, bis das Ausführungs-Berechtigungs-Bit gesetzt wird, auch wenn sie bereits existierte und lesbar war.
- Nach dem Ändern von Berechtigungen sollte man
clearstatcache()aufrufen (siehe unten).
Siehe chmod() für eine Erklärung, wie der oktale Modus 0755 den Besitzer-/Gruppen-/Sonstige-Berechtigungen zugeordnet wird.
Der Stat-Cache-Fallstrick
PHP cached das Ergebnis von Dateisystem-stat-Aufrufen (die von is_executable(), is_readable(), is_writable(), file_exists() und verwandten Funktionen verwendet werden) aus Leistungsgründen. Wenn man die Berechtigungen einer Datei während derselben Anfrage ändert und sie danach erneut prüft, erhält man möglicherweise das veraltete Ergebnis:
<?php
$file = sys_get_temp_dir() . '/cache-demo';
touch($file);
is_executable($file); // result is now cached for this path
chmod($file, 0755);
var_dump(is_executable($file)); // may still report the OLD value
clearstatcache();
var_dump(is_executable($file)); // bool(true) — fresh check
unlink($file);Rufe clearstatcache() nach jedem chmod(), chown(), rename() oder unlink() auf, wenn man denselben Pfad im selben Durchlauf erneut testen möchte.
Verhalten auf verschiedenen Betriebssystemen
- Linux / macOS — das Ergebnis folgt dem Unix-Ausführungs-Bit (
x) für die relevante Benutzer-/Gruppen-/Sonstige-Klasse. Eine Datei mit Modus0644ist nicht ausführbar;0755ist es. - Windows — es gibt kein Ausführungs-Berechtigungs-Bit. PHP leitet „ausführbar" aus der Dateiendung ab: Pfade, die auf
.exe,.bat,.cmdoder.comenden, werden als ausführbar behandelt. Vor PHP 7.4 gabis_executable()unter Windows immerfalsezurück, also auf der Zielversion testen.
Aufgrund dieser Unterschiede sollte man nie davon ausgehen, dass ein Skript, das unter Linux true meldet, dasselbe unter Windows tut, oder umgekehrt.
Wann würde ich es verwenden?
- Vor dem Ausführen eines externen Programms mit
exec(),shell_exec()oderproc_open()— prüfen, ob die Binärdatei tatsächlich ausführbar ist, und bei Bedarf eine klare Fehlermeldung ausgeben, anstatt tief im Aufruf zu scheitern. - Deployment / Integritätsprüfungen — bestätigen, dass ein Hilfsskript (ein Cron-Job, ein Build-Hook) nach dem Kopieren oder Auschecken aus der Versionskontrolle die richtigen Berechtigungen hat, wo das Ausführungs-Bit manchmal verloren geht.
- Sicherheits-Gating — in Kombination mit einem festen Pfad alles ablehnen, was kein bekanntes, korrekt berechtigtes ausführbares Programm ist.
Verwandte Funktionen
is_executable() gehört zu einer Familie von Berechtigungs-/Typ-Prüfungen — wähle diejenige, die zur gestellten Frage passt:
- is_file() — ist der Pfad eine reguläre Datei (kein Verzeichnis)?
- is_dir() — ist der Pfad ein Verzeichnis?
- is_readable() — kann die Datei gelesen werden?
- is_writable() — kann in die Datei geschrieben werden?
- file_exists() — existiert der Pfad überhaupt (Datei oder Verzeichnis)?
- fileperms() — rohe Berechtigungs-Bits lesen.
- chmod() — Berechtigungs-Bits einer Datei ändern.
Fazit
is_executable() gibt true nur zurück, wenn eine Datei sowohl existiert als auch Ausführungsrechte für den aktuellen Prozess besitzt. Drei Dinge sind zu behalten: das Ergebnis ist betriebssystemabhängig (Unix-Ausführungs-Bit vs. Windows-Erweiterung), es wird stat-gecached, also clearstatcache() nach dem Ändern von Berechtigungen aufrufen, und es ist am nützlichsten als Schutzprüfung vor dem Ausführen externer Programme.