Stefan: Letzte Zeile einer Datei auslesen

Hallo!

Welche ist eine effektive Methode mit PHP die letzte Zeile einer Datei auszulesen (ggf. auch die letzten x Byte)?
Ich möchte die Datei nicht durchscanen (while !eof -> fget) und auch nicht unbedingt mit fread vollständig auslesen.

Vielen Dank im Voraus!

Gruß aus Berlin
Stefan

  1. n'abend,

    Hallo!

    Welche ist eine effektive Methode mit PHP die letzte Zeile einer Datei auszulesen (ggf. auch die letzten x Byte)?
    Ich möchte die Datei nicht durchscanen (while !eof -> fget) und auch nicht unbedingt mit fread vollständig auslesen.

    $array = @file('someFile');
    if(is_array($array)) $lastLine = $array[count($array)-1];

    ob das allerdings die effektivste möglichkeit ist, wage ich zu bezweifeln...

    weiterhin schönen abend...

    --
    wer braucht schon großbuchstaben?
    1. Hi,

      ob das allerdings die effektivste möglichkeit ist, wage ich zu bezweifeln...

      Aussagen und Analysen zur Effizienz sollt man nur machen wenn man die Randbedingungen kennt.
      Im allgemeinen wird bei PHP die Bedeutung einzelner Codekonstukte völlig überbewertet.
      Solange deine Daten nur wenige MByte groß sind wird der Interpreter, der Webserver und der Dateizugriff als solcher mit Abstand die meisten Resourcen fressen.

      Gebenchmarkt (*AUA*) könnte deine Lösung gar nicht so schlecht aussehen, einfach deshalb, weil es keine zeichenweise Schleife im PHP gibt.

      Gruß,
        Carsten

  2. hmm
    ich würde alles in ein array packen und dann den letzten eintrag mit "end" holen

    mfg Facetious

  3. Lieber Stefan,

    Welche ist eine effektive Methode mit PHP die letzte Zeile einer Datei auszulesen

    Zeile? Wenn es sich um eine Text-Datei handelt, dann ist das ziemlich einfach.

    $datei = file("pfad/zur/datei");  
    // $datei ist jetzt ein Array  
    $letzte_zeile = array_pop($datei);
    

    Voilá!

    Liebe Grüße aus Ellwangen,

    Felix Riesterer.

    1. Moin!

      Zeile? Wenn es sich um eine Text-Datei handelt, dann ist das ziemlich einfach.

      $datei = file("pfad/zur/datei");

      // $datei ist jetzt ein Array
      $letzte_zeile = array_pop($datei);

        
      Das liest aber die komplette Textdatei in den Speicher ein - das sollte ja gerade vermieden werden.  
        
       - Sven Rautenberg
      
      1. Lieber Sven,

        Das liest aber die komplette Textdatei in den Speicher ein - das sollte ja gerade vermieden werden.

        Dann bleibt wohl nur die von Stefan beschriebene Methode, bzw. der von Dir vorgeschlagene Weg mit fseek().

        Liebe Grüße aus Ellwangen,

        Felix Riesterer.

  4. 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
  5. Hallo Stefan,

    Welche ist eine effektive Methode mit PHP die letzte Zeile einer Datei auszulesen (ggf. auch die letzten x Byte)?
    Ich möchte die Datei nicht durchscanen (while !eof -> fget) und auch nicht unbedingt mit fread vollständig auslesen.

    wenn das ganze auf einer Linux-Büchse läuft, bietet sich das Tool "tail" an (-> man tail).
    Es kann sowohl eine Festlegbare Anzahl an Zeilen, als auch eine gewünschte Anzahl an Bytes vom Ende einer Datei lesen.

    cu,
    ziegenmelker