Menu

PHP file_get_contents() : lire un fichier dans une chaîne

file_get_contents('notes.txt') lit un fichier entier et le renvoie sous forme d'une seule chaîne, ou false si c'est impossible. Sa partenaire file_put_contents() écrit une chaîne dans un fichier, et file() renvoie les lignes sous forme de tableau.

Cette page contient des éditeurs exécutables - modifiez, exécutez et voyez la sortie instantanément.

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 voulezUtilisezMémoire
Tout le fichier en une seule chaînefile_get_contents()Tout le fichier
Les lignes sous forme de tableaufile($path, FILE_IGNORE_NEW_LINES)Tout le fichier
Écrire ou remplacer un fichier en un appelfile_put_contents()Les données écrites
Ajouter une ligne à un journalfile_put_contents($path, $line, FILE_APPEND | LOCK_EX)Une ligne
Lire un gros fichier ligne par ligne, ou des lignes CSVfopen() avec fgets() ou fgetcsv()Une ligne
Lire et écrire dans le même fichier ouvertfopen() 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.

Illustration des langages de programmation de Coddy

Apprendre à coder avec Coddy

COMMENCER