W3docs

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ètreDescription
$filenameChemin 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.

php— editable, runs on the server

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 line

Vé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 $filename est invalide d'une manière que PHP ne peut pas résoudre (par ex. une violation open_basedir), PHP peut émettre un E_WARNING. La valeur de retour reste false. 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é. Appelez clearstatcache() avant une nouvelle vérification pour forcer PHP à relire le système de fichiers.
  • false est ambigu. Un résultat false signifie « non accessible en écriture ou inexistant ». Si vous devez distinguer les deux, combinez-le avec file_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.

Pratique

Pratique
Que fait la fonction is_writable() en PHP ?
Que fait la fonction is_writable() en PHP ?
Was this page helpful?