Heim > Artikel > Backend-Entwicklung > So lesen Sie N Zeilen am Ende einer großen Datei in PHP
Dieser Artikel stellt hauptsächlich die Methode zum Lesen der N-Zeilen am Ende einer großen Datei mit PHP vor. Ich hoffe, dass er für alle hilfreich ist.
Bei kleinen Dateien mit einer Größe von wenigen Megabyte können Sie die Datei mit der Funktion file() Zeile für Zeile in ein Array einlesen und dann array_pop verwenden, um die letzte Zeile abzurufen.
Aber für sehr große Textdateien ist der Maschinenspeicher nicht groß genug, oder PHP selbst verfügt über ein Memory_Limit-Limit, sodass diese Methode nicht anwendbar ist. Auch wenn es kein Limit gibt, ist die Effizienz sehr gering.
Gibt es keinen anderen Weg? Natürlich gibt es das, aber es gibt keine vorgefertigte Funktion, also müssen Sie es selbst tun.
Hier muss ein Dateizeiger verwendet werden, der weiß, was ein Zeiger ist: Eine Datei wird derzeit nicht über fopen geöffnet Zu diesem Zeitpunkt zeigt der Zeiger auf den Anfang der Datei und die Zeigerposition ist 0. Wenn Sie den Inhalt der Datei über fgets oder fgetc lesen, rückt der Zeiger beim Lesen entsprechend vor
while(!feof($fp)){ $data.=fgets($fp,4096); }
Das Prinzip der Implementierung besteht darin, dass fgets einen String mit angegebener Länge rückwärts von der aktuellen Zeigerposition bis zu einer neuen Zeile liest Charakter angetroffen wird.
Ist es also möglich, die Position des Zeigers auf die N-te Zeile von unten zu steuern? Leider nein, aber Sie können den Zeiger mit der Funktion fseek() direkt an das Ende und N Positionen zurück bewegen.
Wir bewegen zuerst den Zeiger ans Ende und gehen zwei Positionen zurück, lesen ein Zeichen über fgetc und bestimmen, ob das Zeichen „n“ ist, was ein Newline-Zeichen ist. Gehen Sie dann weiter rückwärts. Eine Position wird erneut beurteilt, bis wir zum letzten Zeilenumbruchzeichen der vorherigen Zeile zurückkehren. Verwenden Sie einfach fgets, um die gesamte Zeile herauszunehmen. Hier werden zwei while-Schleifen verwendet. Die äußere Schleife steuert die Anzahl der abzurufenden Zeilen und die innere Schleife steuert die fseek-Aktion.
Die Funktion ist wie folgt:
/** * 取文件最后$n行 * @param string $filename 文件路径 * @param int $n 最后几行 * @return mixed false表示有错误,成功则返回字符串 */ function FileLastLines($filename,$n){ if(!$fp=fopen($filename,'r')){ echo "打开文件失败,请检查文件路径是否正确,路径和文件名不要包含中文"; return false; } $pos=-2; $eof=""; $str=""; while($n>0){ while($eof!="\n"){ if(!fseek($fp,$pos,SEEK_END)){ $eof=fgetc($fp); $pos--; }else{ break; } } $str.=fgets($fp); $eof=""; $n--; } return $str; } echo nl2br(FileLastLines('sss.txt',4));
Zusammenfassung: Das Obige ist das Ganze Ich hoffe, dass der Inhalt dieses Artikels für das Studium aller hilfreich sein kann.
Verwandte Empfehlungen:
php Ausführliche Erläuterung des WeChat-Algorithmus zur Zufallsgenerierung des roten Umschlags
phpDrei Methoden zur Implementierung der nicht gepufferten Abfrage-API
Das obige ist der detaillierte Inhalt vonSo lesen Sie N Zeilen am Ende einer großen Datei in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!