file_get_contents('notes.txt') lit le fichier entier et le renvoie sous forme d'une seule chaîne. Si le fichier ne peut pas être lu, elle renvoie false. Pour écrire, utilisez file_put_contents('notes.txt', $text), qui crée le fichier ou remplace son contenu.
Sortie :
Buy milk
Call Ada
Write docs
29 bytes
3 lines
Le bloc écrit d'abord notes.txt puis le relit, pour avoir un fichier sur lequel travailler. Un chemin comme 'notes.txt' est relatif au dossier de travail courant ; dans une application web, construisez le chemin à partir du dossier du script avec __DIR__ . '/notes.txt'.
Écrire et ajouter avec file_put_contents()
file_put_contents() renvoie le nombre d'octets écrits, ou false en cas d'échec. Par défaut, elle écrase le fichier. L'option FILE_APPEND ajoute plutôt à la fin, c'est ainsi que fonctionnent les journaux simples, et LOCK_EX empêche deux requêtes d'écrire au même moment :
Sortie :
Wrote 8 bytes
started
step 1 done
step 2 done
replaced
abc
5 bytes
Pour stocker un tableau et le récupérer sous forme de tableau, écrivez-le en JSON avec json_encode() et relisez-le avec json_decode().
Lire un fichier ligne par ligne avec file()
file() lit un fichier dans un tableau avec une ligne par élément. Chaque ligne garde son saut de ligne final sauf si vous passez FILE_IGNORE_NEW_LINES, et FILE_SKIP_EMPTY_LINES supprime les lignes vides (elle ne fonctionne qu'avec FILE_IGNORE_NEW_LINES) :
Sortie :
string(9) "Buy milk
"
1. Buy milk
2. Call Ada
3. Write docs
3 tasks
file() et file_get_contents() chargent tout le fichier en mémoire. Cela convient pour des fichiers de configuration et des journaux de quelques mégaoctets. Pour un fichier de plusieurs centaines de mégaoctets, lisez-le plutôt ligne par ligne avec fopen() et fgets().
Vérifier qu'un fichier existe avant de le lire
Quand le fichier manque, file_get_contents() renvoie false et PHP affiche un warning :
Warning: file_get_contents(missing.txt): Failed to open stream: No such file or directory in /home/index.php on line 2
Vérifiez d'abord avec is_file() (un fichier qui existe et n'est pas un dossier) ou file_exists() (un fichier ou un dossier), et comparez toujours le résultat avec === false, car un fichier vide renvoie "", qui est aussi évalué à faux :
Sortie :
empty.txt exists file
missing.txt missing
. exists directory
Cannot read missing.txt, using defaults
bool(false)
bool(true)
0 bytes
Ne masquez pas le warning avec @file_get_contents(). Vérifier d'abord, ou traiter false, garde l'erreur visible quand autre chose tourne mal.
Lire une partie d'un fichier
Les quatrième et cinquième arguments sont la position en octets où commencer et le nombre d'octets à lire. Une position négative compte depuis la fin du fichier. Les arguments nommés permettent de sauter les deux arguments intermédiaires :
Sortie :
HEADER
line 2
last line
Les positions comptent des octets, pas des caractères. En UTF-8, un caractère japonais fait 3 octets, donc une position au milieu de l'un d'eux le coupe en deux. Pour travailler sur des caractères, lisez toute la chaîne et utilisez mb_substr().
Afficher un fichier texte sur une page web
Le contenu d'un fichier est du texte, et le texte affiché dans du HTML doit être échappé, sinon un < dans le fichier devient une balise. htmlspecialchars() l'échappe et nl2br() transforme les sauts de ligne en balises <br>. Exécutez-le et regardez l'onglet Page :
Retirez htmlspecialchars() et relancez : la page s'arrête maintenant à « v1.2: Fixed », car le navigateur lit <title> comme une vraie balise et avale tout ce qui suit comme titre de la page. La page htmlspecialchars() explique pourquoi c'est important pour tout ce qu'un utilisateur peut écrire.
Lire une URL avec file_get_contents()
Avec allow_url_fopen activé (la valeur par défaut dans php.ini), file_get_contents() lit aussi des URL et renvoie le corps de la réponse. Un contexte de flux ajoute une méthode, des en-têtes, un corps et un délai maximal :
<?php
$html = file_get_contents('https://example.com/');
$context = stream_context_create([
'http' => [
'method' => 'POST',
'header' => "Content-Type: application/json\r\n",
'content' => json_encode(['name' => 'Ada']),
'timeout' => 5,
'ignore_errors' => true, // return the body of 4xx/5xx responses too
],
]);
$response = file_get_contents('https://api.example.com/users', false, $context);
if ($response === false) {
// DNS failure, timeout, or a refused connection
}
Pour les nouvelles tentatives, les redirections avec limites et des codes d'erreur clairs, cURL ou une bibliothèque cliente HTTP comme Guzzle est le meilleur outil.
file_get_contents, file() ou fopen()
| Vous voulez | Utilisez | Mémoire |
|---|---|---|
| Tout le fichier en une seule chaîne | file_get_contents() | Tout le fichier |
| Les lignes sous forme de tableau | file($path, FILE_IGNORE_NEW_LINES) | Tout le fichier |
| Écrire ou remplacer un fichier en un appel | file_put_contents() | Les données écrites |
| Ajouter une ligne à un journal | file_put_contents($path, $line, FILE_APPEND | LOCK_EX) | Une ligne |
| Lire un gros fichier ligne par ligne, ou des lignes CSV | fopen() avec fgets() ou fgetcsv() | Une ligne |
| Lire et écrire dans le même fichier ouvert | fopen() avec r+, a+ ou c+ | Ce que vous lisez |
Les fonctions en un appel ouvrent, lisent ou écrivent, puis ferment le fichier pour vous, elles sont donc le bon choix par défaut. Passez à fopen() quand le fichier est trop gros pour tenir en mémoire ou que vous devez le garder ouvert entre plusieurs opérations.
Questions fréquentes
Comment lire un fichier dans une chaîne en PHP ?
Appelez file_get_contents('path/to/file.txt'). Elle renvoie tout le fichier sous forme de chaîne, ou false si le fichier ne peut pas être lu, comparez donc le résultat avec === false avant de l'utiliser.
Comment ajouter à la fin d'un fichier en PHP ?
Passez l'option FILE_APPEND : file_put_contents('log.txt', "new line\n", FILE_APPEND);. Sans elle, file_put_contents() remplace tout le fichier. Ajoutez LOCK_EX (FILE_APPEND | LOCK_EX) quand plusieurs requêtes peuvent écrire en même temps.
Comment lire un fichier ligne par ligne en PHP ?
Pour de petits fichiers, file('data.txt', FILE_IGNORE_NEW_LINES) renvoie un tableau avec une ligne par élément. Pour de gros fichiers, ouvrez-le avec fopen() et lisez une ligne à la fois avec fgets() dans une boucle while, ce qui ne garde qu'une ligne en mémoire.
Pourquoi file_get_contents renvoie-t-elle false ?
Le fichier n'existe pas, le chemin est relatif à un autre dossier que celui que vous pensez, ou PHP n'a pas la permission de le lire. PHP affiche aussi un warning comme Failed to open stream: No such file or directory. Vérifiez avec is_file() et is_readable(), et construisez les chemins à partir de __DIR__.
file_get_contents peut-elle lire une URL ?
Oui, quand allow_url_fopen est activé dans php.ini : file_get_contents('https://example.com/') renvoie le corps de la réponse. Pour des en-têtes, des données POST ou un délai maximal, passez un contexte créé avec stream_context_create() ; pour tout ce qui est plus élaboré, cURL gère mieux les erreurs.