Utiliser une boucle d' fgets()
appels est la bonne solution et la plus simple à écrire, cependant:
même si le fichier est lu en interne à l'aide d'un tampon de 8192 octets, votre code doit toujours appeler cette fonction pour chaque ligne.
il est techniquement possible qu'une seule ligne soit plus grande que la mémoire disponible si vous lisez un fichier binaire.
Ce code lit un fichier par blocs de 8 Ko chacun, puis compte le nombre de sauts de ligne dans ce bloc.
function getLines($file)
{
$f = fopen($file, 'rb');
$lines = 0;
while (!feof($f)) {
$lines += substr_count(fread($f, 8192), "\n");
}
fclose($f);
return $lines;
}
Si la longueur moyenne de chaque ligne est au maximum de 4 Ko, vous commencerez déjà à économiser sur les appels de fonction, et ceux-ci peuvent s'additionner lorsque vous traitez de gros fichiers.
Référence
J'ai effectué un test avec un fichier de 1 Go; Voici les résultats:
+-------------+------------------+---------+
| This answer | Dominic's answer | wc -l |
+------------+-------------+------------------+---------+
| Lines | 3550388 | 3550389 | 3550388 |
+------------+-------------+------------------+---------+
| Runtime | 1.055 | 4.297 | 0.587 |
+------------+-------------+------------------+---------+
Le temps est mesuré en secondes en temps réel, voyez ici ce que signifie réel
\n
) en cours d'analyse sur une machine Windows (PHP_EOL == '\r\n'
)