is_executable()
La fonction is_executable() vérifie si un fichier existe et peut être exécuté. Elle retourne true si le fichier est exécutable, false sinon.
Qu'est-ce que la fonction is_executable() ?
is_executable() est une fonction PHP intégrée qui indique si un fichier existe et peut être exécuté en tant que programme par le processus courant. Elle retourne true uniquement lorsque les deux conditions sont remplies ; sinon elle retourne false.
« Exécutable » signifie ici que le système d'exploitation autorise l'exécution du fichier — par exemple un script shell, un binaire compilé ou un .exe sous Windows. Un fichier texte ordinaire ou un fichier source .php n'est normalement pas exécutable, même si PHP peut le lire.
Cette page présente la syntaxe, ce que signifie réellement la valeur de retour, les différences de comportement selon le système d'exploitation, ainsi que les pièges courants (mise en cache, fichiers manquants, bits de permission).
Syntaxe
is_executable(string $filename): bool| Paramètre | Description |
|---|---|
$filename | Chemin vers le fichier à vérifier. Peut être relatif au répertoire de travail du script ou un chemin absolu. |
Valeur de retour — true si le fichier existe et est exécutable, false sinon. PHP émet également un E_WARNING si le chemin est invalide (par exemple, si un répertoire dans le chemin ne peut pas être parcouru).
Un exemple basique
La fonction retourne un boolean, ce qui permet de l'utiliser directement dans une condition if. Ici, on pointe vers le binaire PHP ; sur un serveur Linux typique, ce chemin est exécutable et la première branche s'exécute. Le chemin exact varie selon le système, c'est pourquoi l'exemple suivant crée un fichier entièrement contrôlé.
Créer et tester un fichier
La vérification est plus significative quand vous contrôlez les bits de permission du fichier. L'exemple ci-dessous écrit un petit script shell, le marque comme exécutable avec chmod(), et confirme le résultat :
<?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);Deux points à noter :
- Le fichier n'est pas exécutable tant que le bit d'autorisation d'exécution n'est pas défini, même s'il existait déjà et était lisible.
- Après avoir modifié les permissions, vous devez appeler
clearstatcache()(voir ci-dessous).
Consultez chmod() pour savoir comment le mode octal 0755 se traduit en permissions propriétaire/groupe/autres.
Le piège du cache stat
PHP met en cache le résultat des appels stat du système de fichiers (utilisés par is_executable(), is_readable(), is_writable(), file_exists(), etc.) pour des raisons de performance. Si vous modifiez les permissions d'un fichier pendant la même requête et que vous le revérifiez, vous pouvez obtenir l'ancienne réponse :
<?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);Appelez clearstatcache() après tout chmod(), chown(), rename() ou unlink() si vous souhaitez re-tester le même chemin dans la même exécution.
Comportement selon le système d'exploitation
- Linux / macOS — le résultat suit le bit d'exécution Unix (
x) pour la classe utilisateur/groupe/autres concernée. Un fichier avec le mode0644n'est pas exécutable ;0755l'est. - Windows — il n'existe pas de bit de permission d'exécution. PHP déduit « exécutable » à partir de l'extension du fichier : les chemins se terminant par
.exe,.bat,.cmdou.comsont traités comme exécutables. Avant PHP 7.4,is_executable()retournait toujoursfalsesur Windows, donc testez sur votre version cible.
En raison de ces différences, ne supposez jamais qu'un script qui retourne true sur Linux fera de même sur Windows, et vice versa.
Quand l'utiliser ?
- Avant d'exécuter un programme externe avec
exec(),shell_exec()ouproc_open()— vérifiez que le binaire est réellement exécutable et renvoyez une erreur claire s'il ne l'est pas, plutôt que d'échouer en profondeur dans l'appel. - Déploiement / vérifications de santé — confirmez qu'un script auxiliaire (une tâche cron, un hook de build) possède les bonnes permissions après avoir été copié ou extrait d'un système de contrôle de version, où le bit d'exécution est parfois perdu.
- Contrôle de sécurité — combiné avec un chemin fixe, refusez d'exécuter quoi que ce soit qui ne soit pas un exécutable connu et correctement autorisé.
Fonctions associées
is_executable() fait partie d'une famille de vérifications de permissions et de types — choisissez celle qui correspond à la question posée :
- is_file() — le chemin est-il un fichier ordinaire (pas un répertoire) ?
- is_dir() — le chemin est-il un répertoire ?
- is_readable() — le fichier peut-il être lu ?
- is_writable() — le fichier peut-il être écrit ?
- file_exists() — le chemin existe-t-il (fichier ou répertoire) ?
- fileperms() — lire les bits de permission bruts.
- chmod() — modifier les bits de permission d'un fichier.
Conclusion
is_executable() retourne true uniquement lorsqu'un fichier existe et possède la permission d'exécution pour le processus courant. Retenez trois choses : le résultat est dépendant du système d'exploitation (bit d'exécution Unix contre extension Windows), il est mis en cache par stat donc appelez clearstatcache() après avoir modifié les permissions, et il est plus utile comme garde avant d'exécuter des programmes externes.