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ètre | Description |
|---|---|
$filename | Le 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
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'abordclearstatcache()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 retournertruemê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 permissionsFonctions associées
is_readable()— vérifier si un chemin peut être lu.file_exists()— vérifier uniquement qu'un chemin existe.is_file()etis_dir()— distinguer les fichiers des répertoires.chmod()— modifier les permissions d'un chemin.file_put_contents()etfwrite()— les opérations d'écriture que vous protégez généralement avecis_writable().
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.