Introduction à la création et à la manipulation de fichiers PHP
Apprenez à créer et écrire des fichiers en PHP avec fopen(), fwrite(), fclose() et file_put_contents(). Modes d'ouverture, gestion des erreurs.
PHP s'exécute côté serveur, ce qui lui permet de lire et d'écrire de vrais fichiers sur le disque — rapports générés, HTML mis en cache, entrées de journal, CSV exportés, contenu uploadé par les utilisateurs et configuration. Ce chapitre couvre le flux de travail principal pour créer et écrire des fichiers : ouvrir un descripteur de fichier avec le bon mode, écrire des données, et fermer le descripteur. Il explique également quand utiliser les helpers plus simples en une seule ligne.
Il existe deux familles d'outils d'écriture de fichiers en PHP :
- Descripteurs de flux —
fopen()/fwrite()/fclose(). Idéaux lorsque vous écrivez de façon incrémentale (ajout de lignes de journal, diffusion de grandes sorties) et souhaitez un contrôle fin sur le mode du fichier. - Helpers tout-en-un —
file_put_contents(). Idéaux lorsque vous avez toute la chaîne en mémoire et souhaitez simplement la vider dans un fichier en un seul appel.
Nous utiliserons d'abord l'approche par flux, car comprendre les modes est la clé de tout le reste.
Créer et écrire un fichier avec fopen()
Pour écrire dans un fichier, vous devez d'abord l'ouvrir avec fopen(). Cette fonction prend le chemin du fichier et une chaîne de mode, et renvoie un descripteur de fichier (une ressource) sur lequel opèrent les autres fonctions :
<?php
$file = fopen("example.txt", "w"); // open for writing, truncating the file
fwrite($file, "This is an example.\n");
fclose($file); // always close the handleCe que fait chaque ligne :
fopen("example.txt", "w")ouvreexample.txten mode écriture. Si le fichier n'existe pas, il est créé ; s'il existe déjà, son contenu est effacé (tronqué à zéro octet).fwrite()écrit la chaîne dans le fichier et renvoie le nombre d'octets écrits (oufalseen cas d'échec).fclose()vide les données mises en tampon et libère le descripteur. L'omettre peut laisser des données non écrites jusqu'à la fin du script.
Un chemin relatif comme
"example.txt"est résolu par rapport au répertoire de travail courant du script. Pour plus de sécurité et de prévisibilité, préférez un chemin absolu, par exemple__DIR__ . "/example.txt".
Modes de fichier
Le mode passé à fopen() détermine si le fichier est créé, tronqué ou complété, et si vous pouvez le lire. Voici les modes qui comptent pour créer et écrire :
| Mode | Signification | Crée le fichier ? | Contenu existant | Pointeur démarre à |
|---|---|---|---|---|
"w" | Écriture seule | Oui | Effacé | Début |
"w+" | Lecture + écriture | Oui | Effacé | Début |
"a" | Ajout seul | Oui | Conservé | Fin |
"a+" | Lecture + ajout | Oui | Conservé | Fin |
"x" | Écriture seule, échoue si le fichier existe | Oui (seulement si nouveau) | — | Début |
"x+" | Lecture + écriture, échoue si existe | Oui (seulement si nouveau) | — | Début |
Utilisez "x" lorsque vous ne devez pas écraser un fichier existant — par exemple pour écrire un fichier de verrouillage. Utilisez "a" pour les journaux, où chaque exécution doit ajouter au fichier plutôt que l'effacer.
Ajouter au lieu d'écraser
Une erreur très courante est d'utiliser "w" pour un journal et de se demander pourquoi le fichier ne contient jamais qu'une seule ligne. Ouvrez avec "a" pour conserver le contenu précédent et ajouter à la fin :
<?php
$log = fopen("app.log", "a"); // append mode — never erases
fwrite($log, "[" . date("Y-m-d H:i:s") . "] User logged in\n");
fclose($log);Exécutez ceci deux fois et le fichier contiendra deux lignes horodatées au lieu d'une.
Le raccourci : file_put_contents()
Lorsque vous disposez déjà du contenu complet sous forme de chaîne, file_put_contents() effectue l'ouverture, l'écriture et la fermeture en un seul appel :
<?php
// Overwrite (or create) the file with this exact content:
file_put_contents("greeting.txt", "Hello, world!\n");
// Append instead of overwriting:
file_put_contents("app.log", "another line\n", FILE_APPEND);Elle renvoie le nombre d'octets écrits, ou false en cas d'échec. C'est le choix le plus simple pour les petites charges utiles en mémoire. Faites appel à fopen()/fwrite() lorsque vous écrivez dans une boucle ou avez besoin de garder le descripteur ouvert sur plusieurs opérations.
Relire ce que vous avez écrit
Pour confirmer une écriture, ouvrez le fichier en mode lecture ("r") et lisez-le. Le chapitre associé PHP File Open/Read couvre cela en détail, mais la version avec flux est :
<?php
$file = fopen("example.txt", "r");
$contents = fread($file, filesize("example.txt"));
fclose($file);
echo $contents;Ici, fread() lit jusqu'à filesize("example.txt") octets — le fichier entier — dans $contents. Pour une ligne unique, file_get_contents() lit l'intégralité du fichier dans une chaîne sans descripteur à gérer.
Gérer les erreurs et les fichiers manquants
fopen() renvoie false (et émet un avertissement) s'il ne peut pas ouvrir le fichier — permissions insuffisantes, répertoire inexistant ou disque en lecture seule. Vérifiez toujours avant d'écrire :
<?php
$file = fopen("/no/such/dir/example.txt", "w");
if ($file === false) {
echo "Could not open the file for writing.";
} else {
fwrite($file, "ok");
fclose($file);
}Avant de lire un fichier que vous n'avez pas créé lors de la même exécution, confirmez qu'il existe avec file_exists() pour éviter les avertissements de filesize() ou fread().
Autres fonctions de fichier utiles
Au-delà de la création et de l'écriture, PHP propose une boîte à outils complète pour la gestion des fichiers :
file_get_contents()— lire un fichier entier dans une chaîne en un seul appel.file_put_contents()— écrire une chaîne dans un fichier en un seul appel.file_exists()— vérifier si un chemin existe avant d'agir dessus.unlink()— supprimer un fichier.rename()— renommer ou déplacer un fichier.copy()— copier un fichier vers un nouveau chemin.
Pour les fichiers uploadés depuis un formulaire, consultez PHP File Upload, et pour une vue d'ensemble de l'API du système de fichiers, consultez PHP File Handling.
Résumé
- Ouvrez un fichier avec
fopen($path, $mode); le mode contrôle le comportement de création/troncature/ajout. - Utilisez
"w"pour écraser,"a"pour ajouter, et"x"pour refuser d'écraser un fichier existant. fwrite()écrit etfclose()vide et libère le descripteur — fermez toujours.- Pour les écritures de chaînes complètes,
file_put_contents()est l'alternative concise en un seul appel. - Vérifiez la valeur de retour de
fopen()et utilisezfile_exists()pour écrire un code robuste sans avertissements.