Hallo alle zusammen. Ich glaube der Titel sagt eh schon viel aus. Im Grunde habe ich ein eigenes Logskript geschrieben, dass die Zugriffe auf die Homepage nach IP und Datum sortieren sollte und anschließend als .txt Datei speichert. Also ein etwas exklusiveres Logfile. Das ganze sieht so aus:
PHP
//Geordnete IP Logdatei /* * gesamte Datei durchsuchen * wenn IP gefunden, Tag suchen, dann eintragen * wenn IP gefunden, kein Tag, -> neuer Tag, auf Anfang setzen (rekursiv) * wenn keine IP, neue IP ,-> auf Anfang setzen (rekursiv) * Bsp.: * ############### * ***.116.**.58 * ############### * * 2015-12-12 * 15:38:42 --> de --> 200 -->/index.php */ function orderedIPLog($handle, $ip, $fehlerCode, $lang, $dateizugriff, $datum, $zeit){ /* * $handle = Dateizeiger * $ip = Clientip * $fehlerCode = erzeugter HTTP Status Code * $lang = Clientsprache * $dateizugriff = Datei auf die zugegriffen wurde */ //Dateizeiger auf Anfang setzen rewind($handle); //gehe gesamte Datei durch while(!feof($handle)) { //Datei komplett durchlaufen while(!feof($handle)) { //Zeile lesen & Leerzeichen vom Ende entfernen $buffer = rtrim(fgets($handle, 4096)); if($buffer==$ip) { //IP gefunden while(!feof($handle)) { //Zeile lesen & Leerzeichen vom Ende entfernen $buffer = rtrim(fgets($handle, 4096)); if($datum==$buffer) { //IP & Tag gefunden while(!feof($handle)) { //Zeile lesen & Leerzeichen vom Ende entfernen $buffer = rtrim(fgets($handle, 4096)); if($buffer=="###############" || feof($handle) ) { //Am Ende des letzten (gesuchten) Tages ist entweder eine neue IP oder FEOF //Dateizeiger von der jetztigen Position wieder eine Zeile zurückbewegen, (also ans Ende der letzten Zugehörigen) fseek($handle, $counter_1, SEEK_SET); //und eine neue Zeile anhängen fputs($handle, $zeit."\t".$lang."\t".$fehlerCode."\t".$dateizugriff."\n"); return; } else { //Alte Dateizeigerposition speichern $counter_1=ftell($handle); } } } elseif(feof($handle) || $buffer=="###############") { //IP gefunden, aber am Ende der Datei oder bei der nächsten IP ohne den Tag gefunden zu haben if(feof($handle)) { //Wenn am Dateiende //Zeiger am Schluss platzieren fseek($handle, 0, SEEK_END); //Neuen Tag schreiben fputs($handle, "\n".$datum."\n"); //Nochmals den Tag suchen orderedIPLog($handle, $ip, $fehlerCode, $lang, $dateizugriff, $datum, $zeit); return; } else { //Statt dem Tag bereits bei der nächsten IP gelandet. //Dateizeiger wieder um eine Zeile zurück verschieben fseek($handle, $counter, SEEK_SET); //Neuen Tag schreiben fputs($handle, "\n".$datum."\n"); //Nochmals den Tag suchen orderedIPLog($handle, $ip, $datum, $zeit, $fehlerCode, $lang, $dateizugriff, $datum, $zeit); return; } } //Alte Dateizeigerposition speichern $counter=ftell($handle); } } elseif(feof($handle)) { //Am Ende der Datei und keine IP gefunden //Dateizeiger ans Ende setzen fseek($handle, 0, SEEK_END); //IP schreiben fputs($handle, "\n###############\n".$ip."\n"); //Nachdem die IP eingefügt wurde nochmals danach mit einem rekurisven Aufruf suchen. orderedIPLog($handle, $ip, $fehlerCode, $lang, $dateizugriff, $datum, $zeit); return; } } }}
Aufgerufen wird es hier:
PHP
$Tag=date("Y-m-d");
$Uhrzeit=date("H:i:s");
$fp_geordnet=fopen("iplog_geordnet.txt", "r+");
orderedIPLog($fp_geordnet, $client_ip, $HttpStatus, $langCode, $requestURL, $Tag, $Uhrzeit);
fclose($fp_geordnet);
Alles funktioniert wunderbar, bis darauf wenn ich innerhalb der Datei, also nicht am Ende etwas einfügen möchte, wird die Datei teilweise überschreiben und die Zeichen werden nicht eingefügt. Gibt es da irgendein Flag oder ähnliches um das zu ändern?