Heim  >  Artikel  >  Backend-Entwicklung  >  Mehrere Möglichkeiten, große Dateien mit PHP zu lesen

Mehrere Möglichkeiten, große Dateien mit PHP zu lesen

墨辰丷
墨辰丷Original
2018-05-31 10:14:471345Durchsuche

In diesem Artikel werden hauptsächlich verschiedene Methoden zum Lesen großer Dateien basierend auf PHP vorgestellt. Es gibt drei Hauptmethoden. Interessierte Freunde können darauf verweisen.

Das Lesen großer Dateien bereitet uns immer Kopfschmerzen. Wenn wir beispielsweise PHP zum Entwickeln und Lesen kleiner Dateien verwenden, können wir dies direkt mit verschiedenen Funktionen erreichen Ich werde feststellen, dass die häufig verwendeten Methoden nicht normal verwendet werden können oder zu lange dauern und hängen bleiben. Schauen wir uns die Lösung für das Problem des Lesens großer Dateien in PHP an. Ich hoffe, das Beispiel kann Ihnen helfen.

Szenario: PHP liest sehr große Dateien, z. B. eine 1G-Protokolldatei. Ich verwende hier eine 400 MB große access.log-Datei

1. Verwenden Sie die Datei, um sie direkt zu lesen

<?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);
}
?>

Laufergebnis: Insgesamt 10127784 Zeilen verwendet, 7,8764359951s


Mein Computer verfügt über 3G-Speicher, diese Methode wird nicht empfohlen Verwenden Sie, da Sie alle Dateien in den Speicher laden müssen

2. Verwenden Sie den Linux-Befehl 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

Ausführungsergebnis: Nur verwendet Ein paar Millisekunden, einfach zu machen, diese Methode kann nicht unter Windows verwendet werden

3. Verwenden Sie die fseek-Funktion

Diese Methode ist die gebräuchlichste Methode, es ist nicht erforderlich, alles zu lesen Der Inhalt der Datei Content: Da PHP in C geschrieben ist, ähnelt die Implementierung dem Lesen von Dateien in C durch die Bewegung von Zeigern, sodass die Effizienz recht effizient ist. Bei der Verwendung von fseek zum Bearbeiten von Dateien gibt es viele verschiedene Methoden, und die Effizienz kann leicht unterschiedlich sein.

Im Folgenden sind einige häufig verwendete Methoden aufgeführt.


Methode 1: Verwenden Sie fopen zum Öffnen die Datei (vom Dateizeiger-Ressourcenhandle)


<?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);
}
?>

Laufergebnis: 0,338493108749

Methode 2: Stück für Stück lesen Get

<?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);
}
?>

Laufzeit: 0,00199198722839


Verwenden Sie die fgets-Funktion, um

Zeile für Zeile zu lesen

<?php
$file = fopen("testfile.txt","r");
 while(!feof($file))
 {
   echo fgets($file);
 }
 fclose($file);

spl-Bibliotheksfunktion

<?php
try{
  foreach( new SplFileObject(&#39;testfile.txt&#39;) as $line)
  echo $line.&#39;<br />&#39;;
}catch (Exception $e){
  echo $e->getMessage();
}

Darüber hinaus gibt es für interessierte Leser viele Möglichkeiten, Dateien blockweise zu lesen Kann es versuchen, ich habe es ohne Erfolg versucht, es scheint, dass es das Zeilenumbruchzeichen „n“ enthalten muss.

Das Obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, er wird für das Studium aller hilfreich sein.


Verwandte Empfehlungen:

TP5 Anforderungsmethode des Anforderungsobjekts in PHP

Methode zum Hochladen von Dateien in TP5 in PHP

phpMethode zum Konvertieren eines zweidimensionalen assoziativen Arrays in einen String

Das obige ist der detaillierte Inhalt vonMehrere Möglichkeiten, große Dateien mit PHP zu lesen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn