PHP Datei updaten weiß aber nicht wie?

2 Antworten

Vom Beitragsersteller als hilfreich ausgezeichnet

Um sicherzustellen, dass nur die neuen Zeilen in der Datei angezeigt werden, wenn eine neue hinzugefügt wurde, kannst du die Größe der Datei vor und nach dem Lesen vergleichen. Wenn die Größe sich geändert hat, bedeutet das, dass neue Inhalte hinzugefügt wurden und diese angezeigt werden sollten. Hier ist ein Beispiel dafür, wie Du das in deinem Code implementieren kannst.

<?php
  $size = filesize('test.txt');
  while(true)
  {
    clearstatcache();
    $newsize = filesize('test.txt');
    if ($newsize > $size) {
      $Log = file_get_contents('test.txt');
      print $Log;
      $size = $newsize;
    }
    ob_flush();
    flush();
    sleep(3);
  }
?>

Es wird zuerst die Größe der Datei aufgenommen und in der Variablen $size gespeichert. In der while-Schleife wird die Größe der Datei jedes Mal überprüft und verglichen mit der vorherigen Größe. Wenn die neue Größe größer ist, bedeutet das, dass neue Inhalte hinzugefügt wurden und die Datei gelesen und ausgegeben wird.

Hierbei wird auch die Funktion clearstatcache() verwendet, um sicherzustellen, dass die aktuelle Größe der Datei gelesen wird und nicht der Wert aus dem Cache.


Lenzer66u 
Beitragsersteller
 16.01.2023, 13:49

ja funktioniert. Aber nicht so wie ich will. Es wird ja trotzdem alles mehrfach ausgegeben das alte soll weg und das neue dahin wo das alte war.

Brainchild  16.01.2023, 13:53
@Lenzer66u

Eine mögliche Ursache dafür könnte sein, dass die Datei, die du lesen möchtest, nicht im gleichen Verzeichnis wie dein PHP-Skript liegt. Stelle sicher, dass der vollständige Pfad zur Datei in der Funktion file_get_contents angegeben ist.

Eine andere mögliche Ursache könnte sein, dass die Datei nicht lesbar ist oder dass es ein Problem mit den Berechtigungen gibt. Überprüfe die Berechtigungen für die Datei und stelle sicher, dass das PHP-Skript die Berechtigungen hat, um die Datei zu lesen.

Es könnte auch sein, dass die Ausgabe aufgrund des Caches geblockt wird. Du kannst dies mit ob_flush(); flush(); umgehen. Diese Funktionen sorgen dafür, dass die Ausgabe unmittelbar an den Browser gesendet wird, anstatt im Cache zu bleiben.

Es kann auch sein, dass die Datei, die gelesen werden soll, noch nicht existiert oder dass es ein Problem mit dem Dateipfad gibt. Überprüfe, ob die Datei existiert und ob der Pfad korrekt ist.

Brainchild  16.01.2023, 13:57
@Lenzer66u
Probier es so (tut mir leid, das ich das nicht berücksichtigt habe)
<?php
 $size = filesize('test.txt');
 while(true)
 {
  clearstatcache();
  $newsize = filesize('test.txt');
  if ($newsize > $size) {
   $Log = file_get_contents('test.txt');
   echo $Log;
   $size = $newsize;
   file_put_contents("test.txt", "");
  }
  ob_flush();
  flush();
  sleep(3);
 }
?>
Lenzer66u 
Beitragsersteller
 16.01.2023, 13:59
@Brainchild

ja ist alles richtig und es funktioniert ja auch ich erkläre es mal an einem Beispiel.

In der datei steht

1

2

3

die Ausgabe ist:

1

2

3

Jetzt kommt eine neue Zeile (Zahl 4) und nach 3 Sekunden ist die Ausgabe:

1

2

3

1

2

3

4

und nicht

1

2

3

4

die alte Ausgabe bleibt stehen was sie ja aber nicht soll

Brainchild  16.01.2023, 14:02
@Lenzer66u
<?php
  $size = filesize('test.txt');
  while(true)
  {
    clearstatcache();
    $newsize = filesize('test.txt');
    if ($newsize > $size) {
      system('clear');
      $Log = file_get_contents('test.txt');
      echo $Log;
      $size = $newsize;
    }
    ob_flush();
    flush();
    sleep(3);
  }
?>

Oder so für nur neue zeilen

<?php
  $prevLog = array();
  while(true)
  {
      $Log = file("test.txt");
      $newLog = array_diff($Log, $prevLog);
      foreach($newLog as $line) {
        echo $line;
      }
      $prevLog = $Log;
      ob_flush();
      flush();
      sleep(3);
  }
?>


Lenzer66u 
Beitragsersteller
 16.01.2023, 14:37
@Brainchild

funktioniert an sich ganz gut nur leider wird immer die nächste Zeile bei der darauffolgenden Ausgabe dupliziert was ich leider nicht verstehe

das script gibt immer wieder die komplette Datei aus, du musst die letzte Zeile auslesen und vergleichen mit dem letzten abruf.

Generell würde ich aber eher einen shellprozess nutzen und via tail das ganze nach php pipen und dann verarbeiten.