In Datei lesen und auf Veränderung prüfen

bdt, deine Zeile 42: Müsste da nicht $error_size rein?
$error_size ist die aktuelle Grösse der Log-Datei....

Ausserdem werde ich aus deiner Zeile 11 nicht schlau:
Wenn die last_size-Datei existiert, lese die letzte Datei-Grösse von da aus, und weise sie last_size zu
SONST (Datei existiert nicht, Bsp. allererster Aufruf) setze last_size auf aktuelle Grösse (error_size).
In dem Fall wird die If-Bedingung (error_size>last_size) nie erfüllt.
Hätte in Zeile 11 ein $last_size=0 erwartet, damit beim ersten Aufruf die komplette Log durchsucht wird

Damit ist auch Zeile 6 komplett überflüssig, da gemäss deinem code last_size sowieso überschrieben wird:
Entweder mit dem Inhalt der last_size-Datei oder in deinem Fall der aktuellen Grösse
 
Zuletzt bearbeitet:
deine Zeile 42: Müsste da nicht $error_size rein?
Jein, habe vor dem Post die falsche Zeile gelöscht, eigentlich sollte die Zeile mit var_dump raus und dafür
PHP:
$last_size = $error_size;
stehen bleiben.

In dem Fall wird die If-Bedingung (error_size>last_size) nie erfüllt.
Richtig. Aber wie willst du einen Unterschied feststellen, wenn du keinen Ausgangswert hast. Das Script müsste also einmal aufgerufen werden, wobei es eigentlich nur die Größe in die Datei schreibt. Danach läuft es wie gewünscht, kommen Zeilen hinzu, werden diese gefunden. Wenn du beim aller ersten Aufruf des Scripts alle Zeilen prüfen willst, dann hast du natürlich recht. Ich bin davon ausgegangen, dass ab Zeitpunkt X das Script das erste mal läuft.

Hier die korrigierte Fassung:

PHP:
<?php
   $fn = "mysql.log";
 
   $error_size = filesize($fn);
 
   $last_size = 0;
 
   if (file_exists("last_size.txt"))
       $last_size = trim(file_get_contents("last_size.txt"));
   else
       $last_size = $error_size;
 
   $new_lines = array();
 
   if ($error_size > $last_size)
   {
       $fp = fopen($fn, "r");
    
       $count = 0;
    
       if (fseek($fp, $last_size) == 0)
       {
          while (!feof($fp))
          {           
              if (($line = fgets($fp, 4096)) !== false)
              {           
                 $new_lines[] = $line;
                 $count++;
              }
          }
        
          echo "$count lines found<br>";
       }
       else
           die ("fseek error");
    
       fclose($fp);
    
       $last_size = $error_size;
   }
 
   file_put_contents("last_size.txt", $last_size);
?>
 
Zuletzt bearbeitet:
Hallo, vielen Dank für euere Antworten.

Ich denke, meine Idee ist nicht OK.

Der Vorschlag von Sempervivum hat mir weitergeholfen

Ich probiere mal folgendes:

Code:
/*

1 mysql_error.log kopieren und umbenennen zu mysql_error_old.log

2 mysql_error.log mit mysql_error_old.log vergleichen
3 wenn nicht gleich prüfe mysql_error.log auf [Warning]
4 wenn [Warning] gefunden sende die mysql_error.log per E-Mail
5 andernfalls sende nur die neu hinzugekommenen Zeilen in der mysql_error.log per E-Mail

Nach 5 Minuten wiederhole Punkt 2 bis 5

*/
 
Die Diskussion ist zwar weiter gegangen, aber ich muss da noch eine Anmerkung machen:
Der Vorschlag von Sempervivum hat mir weitergeholfen
Wenn du unbedingt die schlechtere Alternative nehmen willst ...

Ein Kopieren und Einlesen der kompletten Log-Datei ist nicht nötig und speicherfressend!
Das Thema "Lösungen" hatten wir ja woanders schon Mal und anscheinend ist mein Vorschlag für den Fragestellen eine brauchbare Lösung. In solchen Fällen fällt mir immer ein Zitat ein:
Stay away from negative people, they have a problem for every solution.
hat Albert Einstein gesagt.
Meine Lösung hat nicht nur Nachteile: Sie ist klar und gut lesbar weil man genau das notiert was gemacht werden soll: "Bilde den Unterschied zwischen dem Stand von jetzt und dem vor fünf Minuten". Gegenüber einer undurchsichtigen Rechnerei mit Dateigrößen und absoluten Positionen.
 
Zurück