W3docs

is_writeable()

La fonction is_writable() vérifie si un fichier ou répertoire est accessible en écriture. Retourne true si c'est le cas, false sinon.

Ce que fait la fonction is_writable()

La fonction is_writable() est une fonction PHP intégrée qui vérifie si un chemin donné existe et peut être écrit par le processus en cours. Elle fonctionne aussi bien pour les fichiers que pour les répertoires. Elle retourne true lorsque le chemin existe et est accessible en écriture, et false dans le cas contraire — y compris lorsque le chemin n'existe pas du tout.

Cette page couvre la syntaxe, la valeur de retour, les utilisations courantes et les pièges à éviter (mise en cache, liens symboliques, root, et l'alias déprécié is_writeable()) qui peuvent poser problème.

is_writeable() vs is_writable()

is_writeable() (avec le e supplémentaire) est un ancien alias de is_writable(). Il a été déprécié dans PHP 5.0.0 et supprimé dans PHP 8.0.0, où son appel génère désormais une Error fatale. Utilisez toujours l'orthographe canonique is_writable() dans le code moderne.

Syntaxe

is_writable(string $filename): bool
ParamètreDescription
$filenameLe chemin vers le fichier ou répertoire à vérifier. Peut être relatif (résolu par rapport au répertoire de travail courant) ou absolu.

Valeur de retour : true si $filename existe et est accessible en écriture, sinon false. Un chemin inexistant retourne false plutôt que de lever une erreur.

Exemple de base

php— editable, runs on the server

La fonction retourne un booléen, ce qui permet de l'utiliser directement dans une condition if. Ici, le message dépend de si le processus exécutant le script a la permission d'écriture sur /path/to/file.

Un modèle d'écriture sécurisé

L'utilisation la plus courante consiste à protéger une écriture afin que votre script échoue gracieusement plutôt que de planter avec un avertissement de permission :

<?php

$logFile = __DIR__ . '/app.log';

if (is_writable($logFile)) {
    file_put_contents($logFile, "Started at " . date('c') . "\n", FILE_APPEND);
    echo "Log entry written.";
} else {
    echo "Cannot write to $logFile — check permissions.";
}

Notez que is_writable() vérifie un chemin existant. Si le fichier n'existe pas encore, il vaut généralement mieux tester le répertoire qui le contiendra, car la création d'un nouveau fichier nécessite la permission d'écriture sur le répertoire parent :

<?php

$target = __DIR__ . '/cache/data.json';

if (is_writable(dirname($target))) {
    file_put_contents($target, '{}');
    echo "File created.";
} else {
    echo "The cache directory is not writable.";
}

Points de vigilance

  • Les résultats sont mis en cache. PHP met en cache les métadonnées du système de fichiers via le stat cache. Si vous modifiez les permissions pendant un script (par exemple avec chmod()) et re-vérifiez le même chemin, appelez d'abord clearstatcache() pour obtenir un résultat actualisé.
  • Cela teste le propriétaire du processus, pas votre compte. Un chemin accessible en écriture dans votre terminal peut ne pas l'être pour l'utilisateur du serveur web (www-data, nginx, etc.) qui exécute réellement PHP.
  • Exécution en tant que root. Le superutilisateur peut écrire presque partout, donc is_writable() peut retourner true même sur des fichiers marqués en lecture seule. Ne comptez pas dessus comme limite de sécurité.
  • Les liens symboliques sont suivis. La vérification s'applique à la cible d'un lien symbolique, pas au lien lui-même.
  • Conditions de concurrence (TOCTOU). Un chemin peut devenir non accessible en écriture entre la vérification et l'écriture réelle. Pour les écritures critiques, tentez l'écriture et gérez l'échec plutôt que de vous fier uniquement à la vérification.
<?php

chmod('/tmp/example.txt', 0644);
var_dump(is_writable('/tmp/example.txt')); // may show stale value
clearstatcache();                          // refresh the stat cache
var_dump(is_writable('/tmp/example.txt')); // now reflects the new permissions

Fonctions associées

Conclusion

is_writable() vous permet de vérifier, avant d'écrire, si un fichier ou un répertoire est accessible en écriture par le processus en cours — retournant false pour les chemins manquants sans lever d'exception. N'oubliez pas de vérifier le répertoire parent lors de la création de nouveaux fichiers, d'appeler clearstatcache() après avoir modifié les permissions en cours de script, et d'utiliser l'orthographe canonique puisque is_writeable() a été supprimé dans PHP 8.

Pratique

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