letzte Zeile zuerst
Tobi
- php
Hallo,
ich (Anfänger) habe folgendes sehr einfaches script geschrieben, um eine userlog-datei auszulesen:
(Beispiel Zeite aus Datei: Thomas|217.4.53.2|http://www.XXXX.de/XXX/member.shtml|Mozilla/4.0 (compatible; MSIE 5.5; Windows 98; Win 9x 4.90)|Mon Jun 17 22:02:54 2002|)
<?PHP
$statistik = "userlog.txt";
$fp = fopen($statistik,"r");
while($zeile = fgetcsv($fp,2000,"|")){
$x=0;
echo " $zeile[$x] ";
$x=4;
echo " $zeile[$x] ";
}
fclose($fp);
?>
Das klappt auch ganz gut, nur möchte ich jetzt, dass die unterste (aktuellste) Zeile der userlog.txt zu erst ausgegeben wird.
Danke für die Hilfe, MgG Tobi
Hallo,
ich (Anfänger) habe folgendes sehr einfaches script geschrieben, um eine userlog-datei auszulesen:
(Beispiel Zeite aus Datei: Thomas|217.4.53.2|http://www.XXXX.de/XXX/member.shtml|Mozilla/4.0 (compatible; MSIE 5.5; Windows 98; Win 9x 4.90)|Mon Jun 17 22:02:54 2002|)
<?PHP
$statistik = "userlog.txt";
$fp = fopen($statistik,"r");
while($zeile = fgetcsv($fp,2000,"|")){
$x=0;
echo " $zeile[$x] ";
$x=4;
echo " $zeile[$x] ";
}
fclose($fp);
?>
Das klappt auch ganz gut, nur möchte ich jetzt, dass die unterste (aktuellste) Zeile der userlog.txt zu erst ausgegeben wird.
Hallo Tobi,
mein erster Gedanke war: das geht nicht. Aber man soll ja nicht immer gleich aufgeben.
Ich habe da eine Idee, eine recht einfache sogar. Allerdings weiß ich nicht, ob das Speichermanagement von php da noch mitspielt. Lassen wir es doch mal darauf ankommen.
In Kladde:
Einlesen der gesamten Datei in eine Variable OK
Anwendung der Stringfunktion strrev() auf die Variable ??
Einlesen der Zeilen (die sind jetzt rückwärts) immer bis zum nächsten Zeilenende-Zeichen.
Umdrehen und anzeigen.
Der Vorteil bei Linux-Systemen ist, dass sie nur ein Character für das Zeilenende einsetzen. Bei DOS-Datein hättest Du mit CR-LF zwei Zeichen zu suchen und das in der richtigen Reihenfolge.
Dumme Idee. -> Andere
Feststellung der Dateilänge
Rechnerische Einteilung in Blöcke
Datei öffnen im BINÄRMODE
Dateizeiger positionieren auf letzten Block
Einlesen des Blockes in Variable
Explode in ein Stringarray mit 0Ah als Trennzeichen.
Die erste Zeile muss man wahrscheinlich wegschmeißen.
Aber Du willst das Array ja sowieso von hinten lesen.
Wenn Du willst, versuchen wirs mal...
Zeilenende-Zeichen
Linux/Unix 0A
DOS 0D 0A
MAC 0D
Moin Moin !
Hast Du ein Unix auf dem Server, sprich: *BSD, Linux, MacOS X, Solaris, CygWin http://sources.redhat.com/cygwin/ ?
Dann öffne eine Pipe zum Programm tac http://theoryx5.uwinnipeg.ca/gnu/textutils/tac.1.html und lies daraus:
$fp=popen("/usr/bin/tac userlog.txt","r"); (http://www.php.net/manual/en/function.popen.php)
und hinterher pclose($fp) statt fclose($fp).
In Perl sähe das übrigens so aus:
open FP,"/usr/bin/tac userlog.txt|" or die "Can't open userlog: $!";
Alexander
Übrigens: tac ist cat rückwärts. ;-)
Hallo,
ich (Anfänger) habe folgendes sehr einfaches script geschrieben, um eine userlog-datei auszulesen:
(Beispiel Zeite aus Datei: Thomas|217.4.53.2|http://www.XXXX.de/XXX/member.shtml|Mozilla/4.0 (compatible; MSIE 5.5; Windows 98; Win 9x 4.90)|Mon Jun 17 22:02:54 2002|)
<?PHP
$statistik = "userlog.txt";
$fp = fopen($statistik,"r");
while($zeile = fgetcsv($fp,2000,"|")){
$x=0;
echo " $zeile[$x] ";
$x=4;
echo " $zeile[$x] ";
}
fclose($fp);
?>
Das klappt auch ganz gut, nur möchte ich jetzt, dass die unterste (aktuellste) Zeile der userlog.txt zu erst ausgegeben wird.
Danke für die Hilfe, MgG Tobi
Moin Moin Alexander(kann ich jetzt auch schon wieder sagen),
Dann öffne eine Pipe zum Programm tac http://theoryx5.uwinnipeg.ca/gnu/textutils/tac.1.html und lies daraus:
$fp=popen("/usr/bin/tac userlog.txt","r"); (http://www.php.net/manual/en/function.popen.php)
und hinterher pclose($fp) statt fclose($fp).
Übrigens: tac ist cat rückwärts. ;-)
Das Problem von Tobi hat sich jetzt bei mir verselbständigt. Ich habe nämlich eigentlich das gleiche Problem und bastele daran schon eine Weile rum.
Ich logge meinen Traffic auf dem Webserver. Da kommen im Monat inzwischen so um die 1.600.000 Zeilen zusammen. Um da den Überblick zu haben, möchte ich Tagesauszüge der Logdatei erstellen, natürlich von hinten gelesen.
Leider kann man die Datei nicht schließen oder umbenennen oder so, dann muß iptraf neu gestartet werden. Es merkt nicht, wenn man ihm die Datenbasis unterm Hintern wegzieht. Das möchte ich wegen der Dokumentationslücke nur ganz selten tun.
Bisher wird die Auswertung mit einem PHP-Script durchgeführt. Das ist aber inzwischen damit "etwas" überlastet, da immer die ganze Datei durchgerechnet wird.
Wenn man nun mit tac von hinten eine bestimmte Anzahl Zeilen bereitstellen könnte für das Script wäre mir schon geholfen.
Hast Du da eine Idee für mich?
Grüße
Tom