Alain Barraud Mémento informatique  
 
Accueil Logithèque - SE Photo - vidéo Internet - protocoles Site Web PC - Réseau Archives
Page ouverte le 03/03/2010
retour sommaire PHP
Logo PHP
Partie 2 : Lire et écrire dans un fichier

Les variables sont simples à utiliser, mais ce sont des informations temporaires. La durée de vie d'une variable n'est en effet jamais très longue. Or, on aura certainement besoin sur notre site de stocker des informations définitivement.
Par exemple, il est impossible de stocker les messages d'un forum dans des variables… puisque celles-ci seront supprimées à la fin de l'exécution de la page ! Pour stocker ces informations longtemps, il faut les écrire sur le disque dur. Quoi de plus logique pour cela que de créer des fichiers ?
PHP permet justement d'enregistrer des données dans des fichiers sur le disque dur du serveur.
Sommaire

Autoriser l'écriture de fichiers (chmod)

Pour que PHP puisse créer des fichiers, il doit avoir accès à un dossier qui autorise la création de fichiers par PHP. Il faut en effet donner le droit à PHP de créer et modifier les fichiers, sinon celui-ci ne pourra rien faire.
Pour créer ces droits, on dit en général qu'on doit modifier le CHMOD du fichier ou du dossier. C'est le nom de la commande qui permet de modifier les droits sous Linux.
alt Sous Windows, cela n'existe pas. Mais les serveurs hébergeant les sites sont souvent sous Linux.
Le CHMOD est un nombre à 3 chiffres que l'on attribue à un fichier (par exemple 777). Selon la valeur de ce nombre, Linux autorisera (ou non) la modification du fichier.
Le problème, c'est qu'en général Linux n'autorise pas les modifications de fichiers par un script PHP. Or, c'est justement ce qu'on veut faire. Alors, comment on va faire ? En modifiant le CHMOD.
Il va falloir passer par son logiciel FTP ! Celui qui vous sert à envoyer nos pages sur le web.
Manipulation avec Filezilla :
se connecter à son serveur, et faire un clic droit sur l'un des dossiers du serveur :

clic droit fichier
Ensuite, on a en général un menu "CHMOD" ou "Permissions de fichier" qui ouvre une fenêtre ressemblant à :

attributs fichier

Maintenant, le fonctionnement. Sans rentrer dans les détails de Linux, il y a 3 types de personnes qui ont le droit de lire/modifier les fichiers :
  • Le propriétaire : utilisateur sous Linux qui a créé le fichier. Il a en général tous les droits : lire, écrire, exécuter.
    Selon les droits qu'il possède, le premier chiffre du CHMOD change. Ici, 7 veut dire qu'il a tous les droits.
  • Le groupe : ça ne nous concerne pas. ce sont les droits du groupe utilisateurs auquel appartient le propriétaire du fichier. Cela correspond au 2ème chiffre du CHMOD (ici :7)
  • Permissions publiques : voilà qui nous intéresse. Les permissions publiques concernent tout le monde, c'est-à-dire même nos fichiers PHP. C'est le troisième chiffre du CHMOD (par défaut 5, il faut mettre cette valeur à 7).
Si on rentre 777 comme valeur pour le CHMOD, ça veut dire que tous les programmes du serveur ont le droit de modifier le fichier, notamment PHP. Il faut donc rentrer 777 pour que PHP puisse modifier le fichier en question.
alt On peut aussi modifier le CHMOD d'un dossier. Cela déterminera si on a le droit de lire/écrire dans ce dossier.
Cela nous sera notamment utile si on a besoin d'écrire des fichiers dans un dossier en PHP.
Pour en savoir plus sur le CHMOD, voir tuto Linux Les utilisateurs et les droits

Ouvrir et fermer le fichier

Avant de lire/écrire dans un fichier, il faut d'abord l'ouvrir.
Par exemple, commençons par créer un fichier compteur.txt qu'on envoie sur notre serveur avec logiciel FTP et on lui applique un CHMOD à 777 comme on vient de voir.
Maintenant, on va créer un fichier PHP qui va travailler sur compteur.txt.
On va compter le nombre de fois qu'une page a été vue sur notre site et enregistrer ce nombre dans ce fichier.
Voici comment on va procéder :
Code PHP
<?php
// 1 : on ouvre le fichier
$monfichier = fopen('compteur.txt', 'r+');

// 2 : on fera ici nos opérations sur le fichier…

// 3 : quand on a fini de l'utiliser, on ferme le fichier
fclose($monfichier);
?>
Il y a 3 étapes à respecter :
  1. On ouvre le fichier avec fopen. Cette fonction renvoie une information qu'on doit mettre dans une variable (ici : $monfichier). Cela sera utile tout à l'heure pour fermer le fichier.
    On indique tout d'abord à fopen le fichier qu'on veut ouvrir (compteur.txt), et comment on veut l'ouvrir (ici, on a mis 'r+'). Voici les principales possibilités qu'on a :
    ModeExplication
    rCela ouvre le fichier en lecture seule. Cela veut dire qu'on ne peut que lire le fichier.
    r+Cela ouvre le fichier en lecture / écriture. On pourra non seulement lire le fichier, mais aussi écrire dedans (on l'utilisera assez souvent en pratique).
    aOuvre le fichier en écriture seule. Mais il y a un avantage : si le fichier n'existe pas, ça le crée automatiquement.
    a+Ouvre le fichier en lecture et écriture. Si le fichier n'existe pas il est créé automatiquement. Attention : le répertoire doit avoir un CHMOD à 777 dans ce cas ! A noter que si le fichier existe déjà, le texte sera rajouté à la fin.
    Ici, on a créé le fichier avant, donc pas besoin d'utiliser a+.
  2. On fait nos opérations de lecture / écriture sur le fichier. On va voir comment ça fonctionne.
  3. Enfin, quand on a fini d'utiliser le fichier, on fait un fopen pour le fermer. On doit préciser quel fichier on doit fermer : on y met la variable $monfichier pour que PHP sache duquel il s'agit, et c'est bon.
alt On n'est pas obligé de donner l'extension .txt à son fichier. On peut l'appeler comme on veut : compteur.cpt, compteur.num ou même compteur tout court.

Lire et écrire dans le fichier

Lire
Pour lire, on a 2 possibilités :
  1. Lire caractère par caractère avec la fonction fgetc
  2. Lire ligne par ligne avec fgets
En général, on se débrouillera pour mettre une information par ligne dans notre fichier. On utilise donc assez peu fgetc qui est assez lourd à utiliser (il faudrait faire une boucle pour lire caractère par caractère).
Dans notre cas, on va supposer que notre fichier ne contient qu'une ligne : le nombre de pages qui ont été vues sur le site.
Pour récupérer ce nombre, il faudra procéder comme ceci :
Code PHP
<?php
// 1 : on ouvre le fichier
$monfichier = fopen('compteur.txt', 'r+');

// 2 : on lit la première ligne du fichier
$ligne = fgets($monfichier);

// 3 : quand on a fini de l'utiliser, on ferme le fichier
fclose($monfichier);
?>
Il faut indiquer à fgets le fichier à lire. On lui donne notre variable $monfichier qui lui permettra de l'identifier.
fgets renvoie toute la ligne (la fonction arrête la lecture au premier saut de ligne). Donc, notre variable $ligne devrait contenir la première ligne du fichier.
question Et si mon fichier fait 15 lignes, comment je fais pour toutes les lire ?
Il faut faire une boucle. Un premier fgets nous donnera la première ligne. Au second tour de boucle, le prochain appel à fgets renverra la deuxième ligne, et ainsi de suite.
C'est un peu lourd, mais si on stocke assez peu d'informations dans le fichier cela peut suffire. Sinon, si on a beaucoup d'informations à stocker, on préfèrera utiliser une base de données (on en parlera dans la prochaine partie).
Ecrire
Pour l'écriture, on n'a qu'une seule possibilité : utiliser fputs.
Cette fonction va écrire la ligne qu'on veut dans le fichier.
Elle s'utilise comme ceci :
Code PHP
<?php fputs($monfichier, 'Texte à écrire'); ?>
Toutefois, il faut savoir où on écrit le texte. En effet, le fonctionnement d'un fichier est assez bizarre :
  1. On l'ouvre avec fopen
  2. On lit par exemple la première ligne avec fgets.
  3. Oui mais voilà, maintenant le "curseur" de PHP se trouve à la fin de la première ligne (vu qu'il vient de lire la première ligne).
    curseur
    Si on fait un fputs juste après, il va écrire à la suite ! Pour éviter ça, on va utiliser la fonction fseek qui va replacer le curseur où on veut dans le fichier.
    En l'occurence, on va replacer le curseur au début du fichier en faisant :
    fseek($monfichier, 0);.
    curseur
    alt Si on ouvre le fichier avec le mode 'a' ou 'a+', toutes les données qu'on écrira seront toujours ajoutées à la fin. La fonction fseek n'aura aucun effet dans ce cas.
  4. le curseur étant au début du fichier, on peut faire un fputs. La ligne va s'écrire par-dessus l'ancienne et l'ancien texte sera écrasé.

En clair, voilà le code source qui compte le nombre de fois que la page a été vue :
Code PHP
<?php
$monfichier = fopen('compteur.txt', 'r+');

$pages_vues = fgets($monfichier);   // On lit la première ligne (nombre de pages vues)
$pages_vues++;   // On augmente de 1 ce nombre de pages vues
fseek($monfichier, 0);   // On remet le curseur au début du fichier
fputs($monfichier, $pages_vues);   // On écrit le nouveau nombre de pages vues

fclose($monfichier);

echo '<p>Cette page a été vue ' . $pages_vues . ' fois !</p>';
?>
Voici la description des 4 lignes du milieu (les plus importantes) :
  1. On récupère la première ligne du fichier, qui est le nombre de pages qui ont été vues pour le moment sur le site.
  2. On ajoute 1 à la variable $pages_vues. Si elle valait 15, elle vaudra désormais 16.
  3. On replace notre fameux "curseur" au début du fichier (parce que sinon il se trouvait à la fin de la première ligne et on aurait écrit à la suite).
  4. On écrit notre nouveau nombre de pages vues dans le fichier, en écrasant l'ancien nombre.
erreur Si on a oublié de mettre un CHMOD à 777 sur le fichier compteur.txt, on aura l'erreur suivante :
Warning: fopen(compteur.txt): failed to open stream: Permission denied
Ici, PHP dit qu'il n'a pas réussi à ouvrir le fichier car il n'a pas le droit d'écrire dedans. Il faut absolument faire ce CHMOD si on veut pouvoir toucher au fichier !

On vient de voir comment on se sert d'un fichier : ouverture, lecture, écriture, fermeture.
Pour un gros fichier, cela devient vite compliqué, mais pour un petit comme celui-ci, cela convient trè bien.