Maison  >  Article  >  développement back-end  >  Plusieurs façons de lire des fichiers volumineux avec PHP

Plusieurs façons de lire des fichiers volumineux avec PHP

墨辰丷
墨辰丷original
2018-05-31 10:14:471391parcourir

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(&#39;memory_limit&#39;, &#39;-1&#39;);
$file = &#39;testfile.txt&#39;;
 
$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 = &#39;testfile.txt&#39;;
$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 = &#39;testfile.txt&#39;;
$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 = &#39;testfile.txt&#39;;
$fp = fopen($file, "r");
$num = 10;
$chunk = 4096;//4K的块
$fs = sprintf("%u", filesize($file));
$readData=&#39;&#39;;
$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(&#39;/(.*?\n){&#39;.$ns.&#39;}/&#39;,$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(&#39;testfile.txt&#39;) as $line)
  echo $line.&#39;<br />&#39;;
}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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn