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('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); } ?>
<?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
<?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); } ?>
<?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); } ?>
Zeile für Zeile zu lesen
<?php $file = fopen("testfile.txt","r"); while(!feof($file)) { echo fgets($file); } fclose($file);
<?php try{ foreach( new SplFileObject('testfile.txt') as $line) echo $line.'<br />'; }catch (Exception $e){ echo $e->getMessage(); }
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!