is_readable()
La fonction is_readable() vérifie si un fichier est lisible en PHP. Elle retourne true si le fichier est lisible, false sinon.
La fonction is_readable() vous indique si PHP peut lire un fichier ou un répertoire donné avant que vous tentiez de l'ouvrir. Elle vérifie que le chemin existe et que le processus en cours dispose des droits de lecture. L'appeler en premier vous permet d'échouer proprement au lieu de déclencher un avertissement d'exécution provenant de fopen() ou de file_get_contents().
Ce chapitre couvre la syntaxe, la valeur de retour, un exemple exécutable, les pièges les plus courants (mise en cache, permissions, conditions de course), et la relation entre is_readable() et les autres fonctions de système de fichiers PHP.
Syntaxe
is_readable(string $filename): bool| Partie | Signification |
|---|---|
$filename | Chemin vers le fichier ou le répertoire à vérifier. Peut être absolu (/var/www/data.txt) ou relatif au répertoire de travail du script. |
| Retourne | true si le chemin existe et est lisible par l'utilisateur/processus courant, false sinon. |
is_readable() fonctionne également sur les répertoires : elle retourne true lorsque le répertoire peut être ouvert et listé.
Exemple de base
La fonction retourne un booléen, elle se lit donc naturellement dans une condition if : vous choisissez une branche selon que le fichier peut être lu ou non, sans jamais l'ouvrir.
Un exemple autonome et exécutable
L'exemple ci-dessus pointe vers un chemin qui peut ne pas exister. Voici une version que vous pouvez exécuter n'importe où — elle crée un fichier, le vérifie, puis vérifie un chemin qui n'existe pas :
<?php
// Create a temp file we know is readable.
$file = tempnam(sys_get_temp_dir(), 'demo');
file_put_contents($file, 'hello');
var_dump(is_readable($file)); // bool(true)
var_dump(is_readable('/no/such/file')); // bool(false)
unlink($file); // clean upLe premier appel est true car le fichier existe et nous venons de le créer avec nos propres permissions ; le second est false car le chemin n'existe pas du tout.
Protéger une lecture de fichier
L'utilisation typique en situation réelle est une vérification préalable à la lecture, afin qu'un fichier manquant ou illisible n'émette pas d'avertissement :
<?php
$path = 'config.json';
if (!is_readable($path)) {
// Handle the problem your way: log, default, or throw.
throw new RuntimeException("Cannot read config file: $path");
}
$config = json_decode(file_get_contents($path), true);Pièges courants
- Les résultats sont mis en cache. PHP met en cache les informations stat par requête. Si vous modifiez les permissions d'un fichier pendant l'exécution du même script, appelez
clearstatcache()avant de vérifier à nouveau, sinon vous risquez d'obtenir une réponse obsolète. truen'est pas une garantie. Les permissions peuvent changer entre la vérification et la lecture effective (une condition de course temps-de-vérification/temps-d'utilisation). Pour du code critique, tentez directement la lecture et gérez l'erreur, plutôt que de vous fier uniquement àis_readable().- Retourne
falsepour les chemins inexistants — sans avertissement. Ainsi,is_readable()sert aussi de vérification « ce chemin existe-t-il et puis-je le lire ». Pour tester l'existence indépendamment des permissions, utilisezfile_exists(). - Les permissions sont évaluées pour l'utilisateur du serveur web (souvent
www-data), et non pour votre utilisateur shell, lorsque le script s'exécute sous un serveur web.
Fonctions associées
is_writable()— l'équivalent pour la permission d'écriture.is_file()— vérifie que le chemin est un fichier ordinaire (pas un répertoire).file_exists()— vérifie l'existence, sans tenir compte des permissions de lecture.fopen()etfile_get_contents()— les fonctions que vous protégez habituellement avecis_readable().
Conclusion
is_readable() est un moyen léger et sans effet de bord de vérifier qu'un chemin existe et peut être lu avant de l'ouvrir. Utilisez-la comme garde pour échouer proprement, gardez à l'esprit que ses résultats sont mis en cache au sein d'une requête, et pour du code critique en matière de sécurité, tentez la lecture et gérez les erreurs plutôt que de vous fier uniquement à la vérification.