Moin!
Welche ist eine effektive Methode mit PHP die letzte Zeile einer Datei auszulesen (ggf. auch die letzten x Byte)?
Die ganze Datei einlesen und die letzte Zeile feststellen ist effektiv. Die letzten X Byte hingegen lassen sich mit fseek() einlesen, ohne den Rest der Datei durchgehen zu müssen.
Ich möchte die Datei nicht durchscanen (while !eof -> fget) und auch nicht unbedingt mit fread vollständig auslesen.
Dann geht's nicht. Die Eigenschaft einer Textzeile, also einer Zeichenkette, die vom Dateianfang oder \r|\n|\r\n vorne und von \r|\n|\r\n bzw. dem Dateiende hinten begrenzt wird, ist ihre unbestimmte Länge. Es ist durchaus denkbar, dass die gesamte Datei nur eine einzige Textzeile enthält, auch wenn sie ein Megabyte groß ist. Genauso kann die Textzeile in den letzten zehn Bytes beispielsweise acht Zeilen enthalten.
Natürlich kann man sich mit fseek() rückwärts durch die Datei forsten, jeweils das vorhergehende Byte einlesen, auf "Zeilenschaltungszeichen" prüfen und ggf. noch weiter zurückgehen. Dieses Einzelbytelesen ist aber extrem langsam im Vergleich zur Verarbeitung längerer Zeichenketten.
Natürlich kann man größere Blöcke von hinten her einlesen und prüfen. Eine effiziente Methode würde ich das aber nur nennen, wenn mehr Randbedingungen bekannt sind, beispielsweise eine durchschnittliche oder maximale Zeilenlänge, und sich daher Vorteile ergeben.
- Sven Rautenberg