Heim  >  Artikel  >  Backend-Entwicklung  >  So lesen Sie N Zeilen am Ende einer großen Datei in PHP

So lesen Sie N Zeilen am Ende einer großen Datei in PHP

墨辰丷
墨辰丷Original
2018-06-02 09:12:471449Durchsuche

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:

Zusammenfassung der PHP-Implementierung zum Abrufen des übergeordneten Verzeichnisses der aktuellen Datei

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!

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