Dans la programmation PHP, il est souvent nécessaire de lire les dernières lignes d'un grand fichier, en particulier lors du traitement des fichiers journaux ou d'autres fichiers journaux. Afin d'améliorer les performances du programme et d'éviter de charger directement le fichier entier en mémoire, nous devons adopter une méthode de lecture plus efficace.
La manière traditionnelle consiste à charger l'ensemble du fichier en mémoire via la fonction de fichier, à la convertir en un tableau, puis à obtenir les n lignes de contenu N à la fin via des opérations de tableau. Cependant, cette approche n'est pas efficace pour les fichiers volumineux car il consomme beaucoup de mémoire.
Par conséquent, nous avons besoin d'un moyen plus d'économie de mémoire et efficace de lire N lignes de contenu à la fin d'un fichier.
Pour améliorer l'efficacité, nous pouvons utiliser des fonctions telles que FSEEK et FGETC de PHP pour lire progressivement les lignes N à la fin d'un grand fichier. Les étapes spécifiques sont les suivantes:
Tout d'abord, nous ouvrons le fichier via fopen et utilisons fseek pour localiser le pointeur de fichier vers la fin du fichier.
$file = "path/to/file.txt";
$file_handle = fopen($file, "r");
fseek($file_handle, 0, SEEK_END);
Ensuite, nous devons utiliser FGETC pour lire le contenu du fichier un par un jusqu'à ce que la nouvelle ligne soit trouvée. Lorsqu'une ligne est lue, enregistrez le contenu de la ligne dans le tableau et continuez à lire jusqu'à ce que des rangées de contenu soient obtenues.
$lines = [];
$n = 10;
$pos = ftell($file_handle);
while ($n > 0 && $pos) {
fseek($file_handle, $pos);
if (($char = fgetc($file_handle)) === "\n") {
array_unshift($lines, fgets($file_handle));
$n--;
}
$pos--;
}
Dans ce processus, nous lisons un personnage à la fois. Lorsque nous rencontrons une nouvelle ligne, cela signifie qu'une ligne a été lue. Chaque fois qu'une ligne est lue, elle est insérée au début du tableau, diminuant N à 1 jusqu'à ce que le nombre requis de lignes soit lu.
En utilisant les fonctions FSEEK et FGETC, nous pouvons lire efficacement les lignes N de la fin d'un grand fichier. Cette approche enregistre non seulement la mémoire, mais améliore également considérablement les vitesses de traitement par rapport à la lecture directe de l'ensemble du fichier dans la mémoire. Cette méthode convient particulièrement aux scénarios où seules quelques lignes à la fin d'un fichier sont nécessaires et sont idéales pour gérer les fichiers volumineux.