Plusieurs façons de lire des fichiers volumineux avec PHP

墨辰丷
Libérer: 2023-03-28 15:44:01
original
1395 Les gens l'ont consulté

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);
}
?>
Copier après la connexion

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
Copier après la connexion

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);
}
?>
Copier après la connexion

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);
}
?>
Copier après la connexion

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);
Copier après la connexion

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();
}
Copier après la connexion

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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!