Ich habe mal wieder ein Problem. Folgenden Code verwende ich gerade:
[PHP]$datafile = fopen(„…/logbuch.txt“, „r“);
fwrite ($datafile,$date." + „.$_SERVER[‚REMOTE_ADDR‘].“ + „.$path.“\r\n");
fclose ($datafile);[/PHP]
Wie man vielleicht erkennt, will ich den neusten Zugriff auf meine Website ganz oben in der Datei zu stehen haben. Jetzt ist aber das Problem, das PHP mir einfach dann die erste Zeile des alten Dokuments löscht. Als Beispiel:
Ich hatte einfach die Hoffnung, die es würde wie im Editor funktionieren. Ich setzte meinen Zeiger an den Beginn der Datei und drücke Strg+V. Doch dem ist nicht so.
Aber ich hab ne Idee, wie ich das trotzdem hinbekomme. Ich lese die Datei ein, speicher sie in einer Variable, schreibe in die Datei dass, was neu reinkommen soll und hänge den Rest wieder ran
Wenn wir das mal an f* demonstrieren wollen:
[PHP]// temp öffnen
$buffer = fopen(‚php://temp‘, ‚r+‘);
// anfangsstring schreiben
fwrite($buffer, ‚prepend string‘);
$file = fopen(‚datei.txt‘, ‚r+‘);
// Datei in Buffer schreiben
while (!feof($file)) {
fwrite($buffer, fread($file, 8192));
}
// beide file-pointer auf Anfang setzen
rewind($buffer);
rewind($file);
// buffer lesen und Datei schreiben
while (!feof($buffer)) {
fwrite($file, fread($buffer, 8192));
}
// Dateigröße neu setzen (Größe des Buffers)
// wäre nicht nötig, da der Buffer automatisch größer ist
ftruncate($file, filesize($buffer));
fclose($buffer);
fclose($file);[/PHP]
Ansonsten geht auch:
[PHP]file_put_contents(‚datei.txt‘, ‚prepend string‘ . file_get_contents(‚datei.txt‘));[/PHP]
kann aber nicht mit sehr großen Dateien umgehen.
Ich hab nicht gesagt, dass es bei mir geht, sondern dass ich das nicht machen würde, da diese vorgehensweise bei grossen Dateien extrem langsam ist. Schreib deine Loginfos an’s Ende der Datei und gut ist. Denn ansonsten muss immer der komplette Inhalt der Datei eingelesen werden.
r+ und dann reinschreiben geht nicht, weil du damit die Daten überschreibst, nicht am Anfang einfügst. Das ist dein Denkfehler. Wenn du es einfügen wolltest, müsstest du erst die Datei einlesen, dann die Datei komplett neu schreiben mit den neuen Daten am Anfang. Dazu musst du aber die Dateizeiger wieder auf den Anfang setzen.
… und wie gesagt, wenn das eine Logdatei ist, dann wird das früher oder später deine Anwendung ziemlich extrem abremsen (und je nach Umgebung kann es auch passieren, dass der Server das Skript komplett abschießt)
[EDIT]Es hat schon seinen Grund, warum in allen Logfiles die neusten Daten am Ende hängen.