fread()
La fonction fread() lit un nombre d'octets spécifié depuis un fichier ouvert en PHP. Syntaxe, valeurs de retour et exemples pratiques.
La fonction fread() lit un nombre d'octets choisi depuis un fichier ouvert. Contrairement aux fonctions qui chargent un fichier entier en un seul appel, fread() vous donne un contrôle précis sur la quantité lue à la fois — ce qui est exactement ce dont vous avez besoin pour les fichiers volumineux, les données binaires ou le contenu en streaming. Cette page couvre sa syntaxe, sa valeur de retour, comment lire un fichier en morceaux sécurisés, et les pièges courants.
Syntaxe
fread(resource $stream, int $length): string|false| Paramètre | Description |
|---|---|
$stream | Un pointeur de fichier (ressource) retourné par fopen(). |
$length | Le nombre maximum d'octets à lire. |
fread() s'arrête dès que l'une de ces conditions se produit : $length octets ont été lus, la fin du fichier (EOF) est atteinte, un paquet devient disponible (pour les flux réseau), ou 8192 octets ont été lus après que le tampon de flux a été rempli (pour les fichiers non réguliers). Elle retourne les octets lus sous forme de string, ou false en cas d'échec.
fread()est sûre pour les données binaires — elle lit les octets exactement tels qu'ils sont, ce qui la rend utilisable pour les images, les PDF et autres fichiers non textuels, pas seulement le texte brut.
Lire un fichier entier
L'utilisation la plus simple consiste à lire un fichier entier en un seul appel en passant sa taille comme $length :
<?php
$filename = 'myfile.txt';
$file = fopen($filename, 'r');
if ($file) {
$data = fread($file, filesize($filename));
echo $data;
fclose($file);
}Ici fopen() ouvre le fichier en mode lecture seule ('r'), filesize() indique combien d'octets contient le fichier, et fread() lit exactement ce nombre. Associez toujours fopen() à fclose() pour libérer le descripteur de fichier.
Pour lire un fichier entier sans avoir besoin d'un descripteur,
file_get_contents()est une alternative en une ligne. Utilisezfread()lorsque vous devez contrôler la taille de lecture ou traiter le fichier de manière incrémentielle.
Lire un fichier par morceaux
Pour les fichiers volumineux, vous ne devez pas tout charger en mémoire d'un coup. Lisez un morceau de taille fixe par itération et arrêtez-vous en fin de fichier avec feof() :
<?php
$file = fopen('large.log', 'r');
if ($file) {
while (!feof($file)) {
$chunk = fread($file, 1024); // read up to 1 KB at a time
echo $chunk;
}
fclose($file);
}Cela maintient une utilisation mémoire constante quelle que soit la taille du fichier, car seul un morceau de 1 Ko réside en mémoire à la fois. Augmentez la taille du morceau (par exemple 8192) pour échanger davantage de mémoire contre moins d'appels de lecture.
Valeur de retour et gestion des erreurs
fread() retourne une string contenant les octets lus. En fin de fichier, elle retourne une string vide "", et en cas d'échec elle retourne false. Puisque "" et false sont tous deux faux (falsy), utilisez une vérification stricte pour les distinguer :
<?php
$file = fopen('data.bin', 'rb');
if ($file === false) {
exit('Could not open the file.');
}
$bytes = fread($file, 16);
if ($bytes === false) {
echo 'Read failed.';
} else {
echo 'Read ' . strlen($bytes) . " bytes.\n";
}
fclose($file);Notez le mode 'rb' : sous Windows, l'ouverture en mode binaire (b) empêche la traduction des fins de ligne qui corromprait les données binaires. Cela est sans effet sur les autres plateformes, donc c'est une bonne pratique pour tout fichier non textuel.
Pièges courants
$lengthest un maximum, pas une garantie. Un seul appel àfread()peut retourner moins d'octets que demandé (par exemple près de l'EOF ou sur un flux réseau). Pour lire une quantité exacte, faites une boucle jusqu'à avoir collecté suffisamment ou atteint l'EOF.- Le fichier doit être ouvert dans un mode lisible. Des modes comme
'w'ouvrent en écriture seule ; utilisez'r','r+','a+', etc. Consultezfopen()pour la liste complète des modes. - N'oubliez pas
fclose(). Les descripteurs non fermés peuvent épuiser les descripteurs de fichiers disponibles dans les scripts à longue durée d'exécution. - Vous lisez des lignes ? Si vous souhaitez lire une ligne à la fois plutôt qu'un nombre d'octets,
fgets()est le meilleur outil.
Fonctions associées
fopen()— ouvrir un fichier et obtenir le pointeur dontfread()a besoin.fwrite()— la fonction homologue qui écrit des octets dans un fichier.fgets()— lire une seule ligne au lieu d'un nombre d'octets.feof()— tester la fin de fichier lors d'une boucle.file-get-contents()— lire un fichier entier en un seul appel.fclose()— fermer le descripteur de fichier lorsque vous avez terminé.
Conclusion
fread() est l'outil PHP pour lire un nombre précis d'octets depuis un fichier ouvert. Utilisez-la avec filesize() pour récupérer un fichier entier, ou combinez-la avec feof() dans une boucle pour traiter en streaming des fichiers volumineux avec une utilisation mémoire maîtrisée. Gardez à l'esprit que $length est une borne supérieure, ouvrez les fichiers binaires avec le drapeau b, et fermez toujours le descripteur avec fclose().