is_writable()
PHP is_writable() retourne true si un fichier ou répertoire est accessible en écriture. Syntaxe, pièges et le cache stat expliqués.
La fonction PHP is_writable() vous indique, avant d'écrire, si le processus actuel est autorisé à écrire dans un fichier ou un répertoire donné. Cette page couvre sa syntaxe, sa valeur de retour, le comportement de mise en cache qui piège les développeurs, et les bonnes pratiques pour l'utiliser en toute sécurité.
Qu'est-ce que la fonction is_writable() ?
is_writable() est une fonction PHP intégrée qui retourne true si le fichier (ou répertoire) nommé existe et est accessible en écriture par l'utilisateur sous lequel le processus PHP s'exécute, et false dans le cas contraire. La fonction prend un argument et n'effectue aucune écriture elle-même — elle ne fait que signaler les permissions.
La vérification est basée sur l'identifiant utilisateur effectif du processus en cours (par exemple, www-data sous Apache/Nginx-FPM), pas l'utilisateur propriétaire du script. Un fichier que vous pouvez modifier dans votre éditeur peut tout de même être signalé comme non accessible en écriture par le serveur web.
is_writable() possède un alias, is_writeable() (notez le e supplémentaire) ; les deux sont identiques.
Syntaxe
is_writable(string $filename): bool| Paramètre | Description |
|---|---|
$filename | Chemin vers le fichier ou le répertoire à vérifier. Peut être relatif au répertoire de travail courant. |
Retourne true en cas de succès, false si le chemin n'est pas accessible en écriture ou n'existe pas.
Comment utiliser la fonction is_writable() ?
Le modèle typique est « regarder avant de sauter » — confirmer qu'un fichier est accessible en écriture avant de tenter de l'ouvrir, afin d'échouer avec un message clair plutôt qu'un avertissement d'exécution.
Comme le bac à sable du runner crée data.txt, l'exemple ci-dessus affiche The file 'data.txt' is writable.
Un exemple complet et exécutable
Ce script autonome crée un fichier, le vérifie, puis n'écrit que si la vérification réussit :
<?php
$file = 'log.txt';
// Create the file so the example is reproducible.
file_put_contents($file, "first line\n");
if (is_writable($file)) {
file_put_contents($file, "second line\n", FILE_APPEND);
echo "Wrote to $file:\n";
echo file_get_contents($file);
} else {
echo "Cannot write to $file.";
}Sortie :
Wrote to log.txt:
first line
second lineVérifier un répertoire
is_writable() fonctionne aussi sur les répertoires. C'est la bonne vérification à faire avant de créer un nouveau fichier : vous ne pouvez pas tester le fichier (il n'existe pas encore), vous testez donc le dossier qui le contiendra.
<?php
$dir = __DIR__; // the directory this script lives in
if (is_writable($dir)) {
echo "New files can be created in: $dir";
} else {
echo "Directory is read-only: $dir";
}Pièges courants
- Elle ne lève pas d'exception — elle avertit. Si
$filenameest invalide d'une manière que PHP ne peut pas résoudre (par ex. une violation open_basedir), PHP peut émettre unE_WARNING. La valeur de retour restefalse. Supprimez avec@uniquement en dernier recours. - Les résultats peuvent être mis en cache. PHP maintient un cache stat. Si les permissions d'un fichier changent pendant l'exécution du même script,
is_writable()peut retourner un résultat périmé. Appelezclearstatcache()avant une nouvelle vérification pour forcer PHP à relire le système de fichiers. falseest ambigu. Un résultatfalsesignifie « non accessible en écriture ou inexistant ». Si vous devez distinguer les deux, combinez-le avecfile_exists().- Condition de course TOCTOU. Entre la vérification
is_writable()et l'écriture effective, les permissions du fichier pourraient changer. Pour du code critique, ne vous fiez pas uniquement à la vérification — gérez également l'échec de l'écriture elle-même.
Lorsque vous changez des permissions en cours de script et revérifiez, videz d'abord le cache :
<?php
$file = 'config.ini';
file_put_contents($file, "data\n");
var_dump(is_writable($file)); // bool(true)
chmod($file, 0444); // make it read-only
clearstatcache(); // force PHP to re-read the filesystem
var_dump(is_writable($file)); // bool(false)Sortie :
bool(true)
bool(false)Fonctions associées
is_readable()— le pendant pour les permissions en lecture.file_exists()— vérifier l'existence sans vérifier les permissions.is_file()— confirmer qu'un chemin est un fichier ordinaire.fopen()/fwrite()— ouvrir et écrire dans des fichiers une fois la vérification effectuée.chmod()— modifier les bits de permission d'un fichier.
Conclusion
is_writable() permet à votre script de confirmer l'accès en écriture en amont et d'échouer élégamment plutôt que de déclencher des avertissements d'exécution. Retenez ses trois particularités : elle reflète les permissions de l'utilisateur du processus, false signifie aussi « manquant », et ses résultats sont mis en cache jusqu'à ce que vous appeliez clearstatcache(). Combinez-la avec la gestion des erreurs de l'écriture réelle pour un code de gestion de fichiers robuste.