Il existe d’autres types de manipulations moins courantes sur les fichiers comme le renommage de fichier ou la suppression que nous allons rapidement voir dans cette nouvelle leçon.
Nous allons également dans cette leçon discuter des niveaux de permission des fichiers, un concept qu’il va être essentiel de comprendre et de maitriser pour travailler avec des fichiers sur un « vrai » site hébergé sur serveur distant.
Tester l’existence d’un fichier
Le PHP met à notre disposition deux fonctions qui vont nous permettre de vérifier si un fichier existe et si un fichier est un véritable fichier.
La fonction file_exists()
vérifie si un fichier ou si un dossier existe. On va devoir lui passer le chemin du fichier ou du dossier dont on souhaite vérifier l’existence en argument. Si le fichier ou le dossier existe bien, la fonction renverra le booléen true
. Dans le cas contraire, elle renverra false
.
La fonction is_file()
indique si le fichier est un véritable fichier (et non pas un répertoire par exemple). Nous allons également devoir lui passer le chemin du fichier supposé en argument. Si le fichier existe et que c’est bien un fichier régulier, alors is_file()
renverra le booléen true
. Dans le cas contraire, elle renverra false
.
<!DOCTYPE html> <html> <head> <title>Cours PHP & MySQL</title> <meta charset="utf-8"> <link rel="stylesheet" href="cours.css"> </head> <body> <h1>Titre principal</h1> <?php //Nous avons créé le fichier exemple.txt précédemment $f = 'exemple.txt'; $d = 'jenexistepas.txt'; if(file_exists($f)){ if(is_file($f)){ echo 'Le fichier ' .$f. ' existe et est bien un fichier'; } else{ echo $f. ' existe mais n\'est pas un fichier régulier'; } }else{ echo $f. ' n\'existe pas'; } echo '<br><br>'; if(file_exists($d)){ if(is_file($d)){ echo 'Le fichier ' .$d. ' existe et est bien un fichier'; } else{ echo $d. ' existe mais n\'est pas un fichier régulier'; } }else{ echo $d. ' n\'existe pas '; } ?> <p>Un paragraphe</p> </body> </html>
Renommer un fichier
La fonction rename()
permet de renommer un fichier ou un dossier. On va devoir lui passer le nom d’origine du fichier ou du dossier et le nouveau nom en arguments.
Dans le cas où le nouveau nom choisi est le nom d’un fichier qui existe déjà, alors ce fichier sera écrasé et remplacé par notre fichier renommé.
<!DOCTYPE html> <html> <head> <title>Cours PHP & MySQL</title> <meta charset="utf-8"> <link rel="stylesheet" href="cours.css"> </head> <body> <h1>Titre principal</h1> <?php //Nous avons créé le fichier exemple.txt précédemment $f = 'exemple.txt'; $d = 'jenexistepas.txt'; if(file_exists($f)){ if(is_file($f)){ $newf = 'fichier.txt'; rename($f, $newf); echo 'Le fichier ' .$f. ' a été renommé en ' .$newf; } else{ echo $f. ' existe mais n\'est pas un fichier régulier'; } }else{ echo $f. ' n\'existe pas'; } ?> <p>Un paragraphe</p> </body> </html>
Ici, on commence par vérifier que notre fichier existe et est bien un fichier régulier. Si c’est le cas, on le renomme en utilisant la fonction rename()
.
Effacer un fichier
La fonction unlink()
permet d’effacer un fichier. On va lui passer le chemin du fichier à effacer en argument. Cette fonction va retourner true
si le fichier a bien été effacé ou false
en cas d’erreur.
<!DOCTYPE html> <html> <head> <title>Cours PHP & MySQL</title> <meta charset="utf-8"> <link rel="stylesheet" href="cours.css"> </head> <body> <h1>Titre principal</h1> <?php $f = 'exemple2.txt'; /*On fait deux opérations en une : on exécute unlink() et on effectue *notre test sur la valeur renvoyée. Si la fonctoiin renvoie true, *on indique que le fichier a bien été effacé*/ if(unlink($f)){ echo 'Le fichier ' .$f. ' a bien été effacé'; }else{ echo 'Le fichier ' .$f. ' n\'a pas pu être effacé'; } ?> <p>Un paragraphe</p> </body> </html>
Introduction aux permissions des fichiers et au Chmod
Le sujet des permissions liés aux fichiers (et aux dossiers) est un sujet très vaste et complexe et nous n’allons ici que l’aborder en surface et dans les grandes lignes afin que vous puissiez comprendre la relation avec les fichiers en PHP.
Le système Linux (utilisés par la plupart des hébergeurs) définit différents types d’utilisateurs pouvant interagir avec les fichiers (et les dossiers) :
- Le propriétaire ;
- Les membres du groupe ;
- Les autres utilisateurs.
La façon dont est créé le système Linux permet à plusieurs utilisateurs d’avoir accès au système en même temps et va nous permettre de définir des groupes d’utilisateurs. Cependant, pour que le système fonctionne toujours bien, il a fallu définir différents niveaux de permission d’accès aux différents fichiers pour les différents utilisateurs.
Pour pouvoir manipuler des fichiers (ou le contenu de dossiers), c’est-à-dire effectuer des opérations dessus, nous allons donc avant tout avoir besoin de permissions. Différentes opérations (lecture du fichier, écriture, etc.) vont pouvoir nécessiter différents niveaux de permission.
Lorsqu’on travaille en local et sur nos propres fichiers on ne doit normalement pas avoir de problème de permissions puisque par défaut le système attribue généralement les permissions maximales au propriétaire du fichier.
Cependant, cela se complique lorsqu’on héberge notre site sur serveur distant et qu’on doit donner un accès aux différents utilisateurs à certains fichiers et c’est là qu’il faut bien faire attention aux différentes permissions accordées.
Les permissions d’accès accordées pour chaque groupe d’utilisateurs à un fichier (ou à un dossier) sont symbolisées par 3 chiffres allant de 0 à 7 ou par 3 lettres. Le premier caractère indique les droits accordés au propriétaire du fichier, le deuxième caractère indique les droits accordés au groupe et le troisième caractère indique les droits accordés aux autres utilisateurs.
Voici les permissions liées à chaque caractère :
Droit | Valeur alphanumérique | Valeur octale |
---|---|---|
aucun droit | --- |
0 |
exécution seulement | --x |
1 |
écriture seulement | -w- |
2 |
écriture et exécution | -wx |
3 |
lecture seulement | r-- |
4 |
lecture et exécution | r-x |
5 |
lecture et écriture | rw- |
6 |
tous les droits (lecture, écriture et exécution) | rwx |
7 |
Si un fichier ou un dossier possède les permissions 754
par exemple, cela signifie qu’on accorde tous les droits (lecture, écriture et exécution) sur les fichiers contenus dans ce dossier à l’auteur, des droits de lecture et d’exécution aux membres du groupe et des droits de lecture uniquement aux autres utilisateurs.
Vérifier et modifier les permissions d’un fichier
Pour vérifier les permissions d’un fichier d’un fichier ou d’un dossier manuellement, on va déjà pouvoir tout simplement effectuer un clic droit dessus et afficher les informations liées à celui-ci.
Pour vérifier les permissions d’un fichier via un script PHP, c’est-à-dire dynamiquement, on va pouvoir utiliser la fonction PHP fileperms()
qui renvoie les permissions pour un fichier.
Cette fonction va renvoyer les permissions d’un fichier sous forme numérique. On pourra ensuite convertir le résultat sous forme octale avec la fonction decoct()
pour obtenir la représentation des permissions selon nos trois chiffres.
Notez que fileperms()
peut renvoyer des informations supplémentaires selon le système utilisé. Les trois derniers chiffres renvoyés correspondent aux permissions.
On va également pouvoir utiliser les fonctions is_readable()
et is_writable()
qui vont respectivement déterminer si le fichier peut être lu et si on peut écrire dedans. Ces fonctions vont renvoyer true
si c’est le cas ou false
dans le cas contraire ce qui les rend très pratiques d’utilisation au sein d’une condition.
<!DOCTYPE html> <html> <head> <title>Cours PHP & MySQL</title> <meta charset="utf-8"> <link rel="stylesheet" href="cours.css"> </head> <body> <h1>Titre principal</h1> <?php /*On teste les permissions de notre *fichier fichier.txt créé précédemment*/ echo decoct(fileperms('fichier.txt')). '<br>'; echo var_dump(is_readable('fichier.txt')). '<br>'; echo var_dump(is_writable('fichier.txt')). '<br>'; ?> <p>Un paragraphe</p> </body> </html>
Pour modifier les permissions d’un fichier en PHP, on va devoir utiliser la fonction chmod()
qui va prendre en arguments le fichier dont on souhaite modifier les permissions ainsi que les nouvelles permissions du fichier en notation octale (on placera un zéro devant nos trois chiffres).
Le réglage des permissions concernant les membres du groupe et les autres utilisateurs va être particulier à chaque cas selon votre site et la sensibilité des informations stockées : vos utilisateurs doivent ils pouvoir lire les fichiers ? Les exécuter ? Les modifier ?
Notez que la fonction chmod()
tire son nom de chmod ou « change mode » qui est une commande Unix permettant de changer les permissions d’accès d’un fichier ou d’un répertoire.
<!DOCTYPE html> <html> <head> <title>Cours PHP & MySQL</title> <meta charset="utf-8"> <link rel="stylesheet" href="cours.css"> </head> <body> <h1>Titre principal</h1> <?php echo 'Permissions d\'origine : ' .decoct(fileperms('fichier.txt')). '<br>'; //chmod() renvoie truc en cas de succès if(chmod('fichier.txt', 0755)){ echo 'Permissions du fichier bien modifiées'; } ?> <p>Un paragraphe</p> </body> </html>
Ici, on change les permissions de notre fichier « fichier.txt » qu’on règle sur 755
grâce à la fonction chmod()
. On tire parti du fait que chmod()
renvoie true
en cas de succès (permissions bien modifiées) ou false
en cas d’échec pour l’utiliser au sein d’une condition.
Bonjour M. Pierre Giraud
Je reviens sur le sujet des permissions.
Le dernier script me revoie le message suivant :
Titre principal
Permissions d’origine : 100777
Warning: chmod(): Opération non permise in /opt/lampp/htdocs/Exemples_PHP/33/exmp_33_05.php on line 16
Un paragraphe
Je ne sais pas si ça un rapport avec les modifications que j’ai fait dans le chapitre précédant ! (voir mes 2 commentaires dans le chapitre précédent)
Là réellement je suis bien coincé !
Merci