Maison > Article > développement back-end > Plusieurs façons de lire des fichiers volumineux avec PHP
Cet article présente principalement plusieurs méthodes de lecture de fichiers volumineux basées sur PHP. Il existe trois méthodes principales. Les amis intéressés peuvent s'y référer.
La lecture de gros fichiers a toujours été un casse-tête. Par exemple, si nous utilisons PHP pour développer et lire de petits fichiers, nous pouvons directement utiliser diverses fonctions pour y parvenir. Cependant, une fois que nous arrivons à un gros article, nous pouvons le faire. constatera que les méthodes couramment utilisées ne peuvent pas être utilisées normalement ou cela prend trop de temps et reste bloqué. Examinons la solution au problème de lecture de fichiers volumineux en PHP. J'espère que l'exemple pourra vous aider.
Scénario : PHP lit des fichiers très volumineux, comme un fichier journal 1G. J'utilise ici un fichier access.log de 400 Mo
Utiliser le fichier pour lire directement
.
<?php $starttime=microtime_float(); ini_set('memory_limit', '-1'); $file = 'testfile.txt'; $data = file($file); $line = $data[count($data) - 1000]; $endtime=microtime_float(); echo count($data),"<br/>"; echo $endtime-$starttime; function microtime_float(){ list($usec, $sec) = explode(" ", microtime()); return ((float)$usec + (float)$sec); } ?>
Résultat d'exécution : 10127784 lignes utilisées au total, 7,8764359951s
Mon ordinateur a une mémoire de 3 Go, cette méthode n'est pas recommandé car tous les fichiers doivent être chargés en mémoire
2. Utilisez la commande Linux tail
<?php $starttime=microtime_float(); $file = 'testfile.txt'; $file = escapeshellarg($file); // 对命令行参数进行安全转义 $line = `tail -n 100 $file`; echo $line,"<br/>"; $endtime=microtime_float(); echo $endtime-$starttime; function microtime_float(){ list($usec, $sec) = explode(" ", microtime()); return ((float)$usec + (float)$sec); } //end
Exécuter résultats : Cela ne prend que quelques millisecondes et se fait facilement. Cette méthode ne peut pas être utilisée sous Windows
3. Utilisez la fonction fseek
Cette méthode est la méthode la plus courante. Elle ne nécessite pas. Tout le contenu du fichier est lu. Parce que PHP est écrit en C, l'implémentation est similaire à la lecture de fichiers en C via le mouvement des pointeurs, donc l'efficacité est assez efficace. Lorsque vous utilisez fseek pour exploiter des fichiers, il existe de nombreuses méthodes différentes, et l'efficacité peut être légèrement différente
Voici quelques méthodes couramment utilisées
Méthode 1 : utilisez fopen pour ouvrir. le fichier (à partir du handle de ressource du pointeur de fichier)
<?php $starttime=microtime_float(); $file = 'testfile.txt'; $fp = fopen($file, "r+"); $line = 100; $pos = -2; $t =$data=""; while ($line > 0) { while ($t != "\n") //换行符 { fseek($fp, $pos, SEEK_END);//移动指针 $t = fgetc($fp);//获取一个字符 $pos--;//向前偏移 } $t = ""; $data = fgets($fp);//获取当前行的数据 $line--; } fclose($fp); echo $data,"<br/>"; $endtime=microtime_float(); echo $endtime-$starttime; function microtime_float(){ list($usec, $sec) = explode(" ", microtime()); return ((float)$usec + (float)$sec); } ?>
Résultat d'exécution : 0,338493108749
Méthode 2 : pièce par pièce Lecture
<?php $starttime=microtime_float(); $file = 'testfile.txt'; $fp = fopen($file, "r"); $num = 10; $chunk = 4096;//4K的块 $fs = sprintf("%u", filesize($file)); $readData=''; $max = (intval($fs) == PHP_INT_MAX) ? PHP_INT_MAX : $fs; for($len = 0; $len < $max; $len += $chunk){ $seekSize = ($max - $len > $chunk) ? $chunk : $max - $len; fseek($fp, ($len + $seekSize) * -1, SEEK_END); $readData = fread($fp, $seekSize) . $readData; if (substr_count($readData, "\n") >= $num + 1) { $ns=substr_count($readData, "\n")-$num+2; preg_match('/(.*?\n){'.$ns.'}/',$readData,$match); $data = $match[1]; break; } } fclose($fp); echo $data,"<br/>"; $endtime=microtime_float(); echo $endtime-$starttime; function microtime_float(){ list($usec, $sec) = explode(" ", microtime()); return ((float)$usec + (float)$sec); } ?>
Durée d'exécution : 0,00199198722839
Utilisez la fonction fgets pour lire ligne par ligne
<?php $file = fopen("testfile.txt","r"); while(!feof($file)) { echo fgets($file); } fclose($file);
fonction de bibliothèque spl
<?php try{ foreach( new SplFileObject('testfile.txt') as $line) echo $line.'<br />'; }catch (Exception $e){ echo $e->getMessage(); }
De plus, il existe de nombreux programmes sur Internet qui lire les fichiers en blocs, les lecteurs intéressés peuvent l'essayer. Je l'ai essayé sans succès. Il semble qu'il doive contenir le caractère de nouvelle ligne "n".
Ce qui précède représente l’intégralité du contenu de cet article, j’espère qu’il sera utile à l’étude de chacun.
Recommandations associées :
TP5 Méthode de requête d'objet de requête en PHP
Méthode de téléchargement de fichiers en TP5 en PHP
phpMéthode de conversion d'un tableau associatif bidimensionnel en chaîne
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!