PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Log-File-Daten bekommen..


nivram
22.07.2003, 22:54:37
Nabend..
Wie in einem anderen Thread bereits erwähnt programmiere ich zur Zeit ein Statistik-Script für Websites!

Da ich schon oft gesehen habe das welche mit PHP den Browser sowie das OS rausbekommen haben, will ich doch gleich mal fragen wie man sowas rausbekommt?

Die Befehle HTTP_USER_AGENT helfen da, aber ich kann mit den Angaben nichts anfangen?!?

Bei mir steht zum Beispiel folgendes:

Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; iOpus-I-M)

Wie erkennt man welches OS man hat, welchen Browser man hat und vorallen Dingen, was ist iOpus-I-M ??? Hab ich noch nie gelesen!

Welche Daten, ausser Bildschirmhöhe und Breite, sowie Uhrzeit, Datum und Referer wären denn noch interessant und mit PHP rauszubekommen??

Ich hoffe mir kann man(n) helfen!

Achja, habe letztens noch ein Script gesehen das auch die eingestellte Sprache (ich glaube des Browsers) ausliest!

Wie geht das?


Gruß und nen schönen Abend... nivram

c4
23.07.2003, 07:25:52
Willst Du den Logfile selber erstellen oder nimmst Du den, der vom Apache generiert wird? Bei letzterem hast Du herzlich wenig Möglichkeiten einzugreifen.
Die Auflösung bekommst Du nur mit JavaScript raus, ist also zu vermeiden. Die meisten nutzen 1024x768 oder höher.

Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; iOpus-I-M)
in dieser Zeile sind 3 Infos enthalten:
Mozilla: die Renderengine
MSIE 6.0: Browser
Windows NT 5.0: Betriebssystem (in dem Fall Windows 2000)

Was dieses iOpus-I-M ist weiß ich nicht. Manchmal steht auch $rFO11RR oder so ein Quark da. Darf also ignoriert werden.

Was man so alles auslesen kann, kannst Du Dir ja mal anschauen, in dem Du Dir eine Datei erstellst, die diesen Inhalt hat: <?php phpinfo(); ?>

nivram
23.07.2003, 10:18:40
Schönund gut..

Wenn irgendwer mir jez noch sagen könnte welches Kürzel "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; iOpus-I-M)"

für welchen Browser und welches OS steht, dann bin ich meinem Ziel schon etwas näher!


Nochmal ne programmiertehnische Frage:

Fügt man so einzelne Daten zu nem Array zusammen?

$platform_array[]=$platform;



Wenn ja: Ich hab immer gedacht dafür müsste man den Befehl array_push verwenden!


Gruß, nivram

c4
23.07.2003, 10:24:52
Wenn irgendwer mir jez noch sagen könnte welches Kürzel "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; iOpus-I-M)"

für welchen Browser und welches OS steht, dann bin ich meinem Ziel schon etwas näher! hab ich doch geschrieben:
--------------------------------------------------
Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; iOpus-I-M)
in dieser Zeile sind 3 Infos enthalten:
Mozilla: die Renderengine
MSIE 6.0: Browser
Windows NT 5.0: Betriebssystem (in dem Fall Windows 2000)
--------------------------------------------------

Daten zu einem Array kannst Du so hinzufügen, wie Du es geschrieben hast oder auch so: $arr[3]='snaf';

nivram
23.07.2003, 10:31:19
Sorry, ich meinte eigentlich das es doch bei jedem OS ein anderes Kürzel gibt! Für Windows 98 z.B. Win98 oder was weiss ich!

Die Kürzel die in diesen Infos für alle OS existieren wollte ich eigentlich haben! Gibs da irgendwo ne Liste? Genauso möchte ich das für die Browser haben!

Habe mich wahrscheinlich falsch ausgedrückt!


Gruß, nivram

c4
23.07.2003, 10:35:21
Oh. Klar, gibt's. Ich bin 'damals' einfach diese (http://snipsnap.org/space/agents) Liste durchgegangen und hab mir alles rausgenommen, was ich wollte. Am Ende hatte ich dann diese Liste:<?php
// mehrere Varianten sind durch # getrennt und müssen erst mittels explode() getrennt werden
// internes kuerzel => Name, Eintrag in Logfile
$names_browser=array(
'ie3' => array('Internet Explorer 3', 'msie 3'),
'ie4' => array('Internet Explorer 4', 'msie 4'),
'ie5' => array('Internet Explorer 5', 'msie 5'),
'ie6' => array('Internet Explorer 6', 'msie 6'),
'op3' => array('Opera 3', 'opera/3'),
'op4' => array('Opera 4', 'opera/4'),
'op5' => array('Opera 5', 'opera/5'),
'op6' => array('Opera 6', 'opera/6'),
'op7' => array('Opera 7', 'opera/7'),
'gal' => array('Galleon', 'galleon'),
'kon' => array('Konqueror', 'konqueror'),
'aol5' => array('AOL 5', 'aol 5'),
'aol6' => array('AOL 6', 'aol 6'),
'aol7' => array('AOL 7', 'aol 7'),
'aol8' => array('AOL 8', 'aol 8'),
'ns4' => array('Netscape 4', 'netscape/4'),
'ns5' => array('Netscape 5', 'netscape/5'),
'ns6' => array('Netscape 6', 'netscape/6'),
'ns7' => array('Netscape 7', 'netscape/7'),
'fir' => array('Firebird', 'firebird'),
'pho' => array('Phoenix', 'phoenix'),
'gec' => array('Gecko', 'gecko'),
'null' => array('Unbekannt', '^°^')
);

$names_player=array(
'rp' => array('RealPlayer', 'realplayer'),
'qts' => array('QuickTime', 'qts '),
'msmp' => array('Windows MediaPlayer', 'windows-media-player'),
'null' => array('Unbekannt', '^°^')
);

$names_os=array(
'win95' => array('Windows 95', 'win95#windows 95'),
'win98' => array('Windows 98', 'win98#windows 98'),
'winme' => array('Windows ME', 'winme#windows me'),
'winnt3' => array('Windows NT 3', 'windows nt 3#winnt_3'),
'winnt4' => array('Windows NT 4', 'windows nt 4#winnt_4'),
'winnt5' => array('Windows 2000', 'windows nt 5.0#winnt_5.0#windows 2000'),
'winxp' => array('Windows XP', 'windows nt 5.1#winnt_5.1'),
'linux' => array('Linux', 'linux'),
'unix' => array('UNIX', 'unix'),
'mac' => array('Macintosh', 'mac#powerpc'),
'null' => array('Unbekannt', '^°^')
);
?>

nivram
23.07.2003, 10:43:05
Da sin wa doch schonmal aufn richtigen Weg!

Wir nehmen mal an:

'winnt5' => array('Windows 2000', 'windows nt 5.0#winnt_5.0#windows 2000'),

Wir müsste ich nun überprüfen, was wo drin stehen muss?

Muss ich überprüfen ob der letztere Teil (vorher durch explode gesplittet) in der Ausgabe steht?
Dieses Windows 2000 is doch nur für die Statistik selbst der Name und das Kürzel vorne wird für die interne Statistik-Speicherung verwendet!?


Gruß, nivram

c4
23.07.2003, 10:50:14
Also wie ich es gelöst habe, kann ich Dir nicht zeigen, das ist mir zu komplex, was ich da gebastelt habe. ;)

Das 'winnt5' ist für die Arrays: $browser['winnt5'][0]++ und so.
Das 'Windows 2000' ist für die Ausgabe in der Statistik.
Der Rest ist halt das, was in der Statistik vorkommen kann.

Das Ganze halt dann irgendwie so:<?php
$str='Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; iOpus-I-M)'
$temp=explode('#', $names_browser['winnt5'][1]);
$i=0;
while ($i<count($temp)) {
if (strstr($str, $temp[$i])) {
// gefunden
}
$i++;
}
?> Mann könnte $str ja noch an den ; aufsplitten und dann nur mit dem dritten Feld arbeiten, aber das sollte eigentlich nicht nötig sein. Präziser wäre es allerdings.

nivram
23.07.2003, 11:01:39
Hört sich recht einfach an!

Woher willst du aber wissen wann du $names_browser['winnt5'][1] und wann du z.B. win98 nehmen musst?

Ich hab in einem Script schonmal sowas gesehen und der hatte das total komplex mit if-Abfragen usw. gemacht! Ich wollte mir das nich kopieren, weil es nich mein eigenes Werk war und deswegen frage ich hier..



Gruß, nivram

c4
23.07.2003, 11:07:09
War ja nur ein Beispiel das da oben. Im eigentlichen Skript gehe ich ja Zeile für Zeile durch und extrahiere die Daten. Hab dann also mal sowas wie $str von oben. Bei den Browsern wird dann in einer Schleife das gesamte Array durchgegangen und die Überprüfung vorgenommen. Sollte sich also mal was an den Namen der Browser ändern, dann muss ich nichts am Quelltext ändern, sondern nur bei $names_browser & Co.

nivram
23.07.2003, 11:13:23
Achso achso..

Noch ne Frage: Hab mir das Script wovon ich vorher sprach mal angeschaut und da is mir aufgefallen das der Coder oft ein @ vor einigen Scriptteilen gesetzt hat! Warum? Beispiel:
@$percent=$num/$platform_all*100;

Is das nur zur Fehlerausgabeunterdrückung, falls die Rechnung nicht funktioniert?

Mal ne allgemeine Frage:
Was ist schneller (weniger Speicherverbrauch) und komfortabler beim auslesen von Daten aus einer Textdatei:

while($line=chop(fgets($file, 1024)))

oder

mit file einlesen und dann for(en) oder while(n)???????


Gruß, nivram

c4
23.07.2003, 11:22:36
Also das @ unterdrückt - wie erwartet - die Fehlermeldung. Ich hab das Problem vorher abgefangen, ich find's einfach sauberer programmiert.

Tja, zu dem file() oder fopen() kann ich Dir nur diesen Thread empfehlen: http://selfphp.com/forum/showthread.php?s=&threadid=4897
Könnte man eigentlich mal testen, was schneller ist.

nivram
23.07.2003, 11:30:42
Den habe ich mir schonmal durchgelesen gehabt!
Hab nur gedacht du wüstest vielleicht etwas mehr über die Geschwindigkeit bei den verschiedenen Methoden!

Ich danke dir erstmal für die schnelle und sehr gute Hilfe!

Ich werde mich jez mal dransetzen und schauen was sich alles so machen lässt..

Bei Fragen bin ich sofort wieder hier!!

Aber sag ma.. Musst du nich arbeiten oder bist du Student??


Gruß, nivram

c4
23.07.2003, 11:34:09
Bin Azubi, der momentan Praktikum hat. Die ersten 3 Wochen war ich ja schön mit PHP, mySQL, ADODB und anderen lustigen Dingen beschäftigt, aber dann gingen ihm die Aufgaben aus. :(
Man hat aber was neues gefunden: Videos aus dem Archiv sichten und grobe Inhaltsinfos in eine DB einpflegen. Also bei so einer Aufgabe hocke ich 'nebenbei' lieber am Rechner und selfPHPisiere. :)

nivram
23.07.2003, 11:37:22
Sehr schöne Aufgabe! Muss ich sagen!
Was isn das für ne Firma die dich mit PHP usw. beschäftigt und wo du dann später Videos gucken musst??? Komisch!
Ich, als Schüler, hab heute Studientag und deshalb wollte ich langsam wieder mit dem programmieren loslegen! Schon laaaaange net mehr gemacht!


Gruß, nivram

nivram
23.07.2003, 16:55:17
Da meine Frage programmiertechnisch mit dem Log-File-Script zutun hat, nehm ich diesen Thread mal.

Also, ich möchte ne Funktion die öfters vorkommt einbauen! Bisher ists so geregelt!


function getdata($file){
$file1=fopen($file,"r+");
$string=chop(fgets($file1,1024));
$data = explode("|", $string);
}




call_user_func("getdata", "counterdata.txt");


Nur liefert das mir überhaupt nichts brauchbares zurück!
Geht das nich oder hab ich was falsch gemacht?


Gruß, nivram

c4
23.07.2003, 16:59:38
Doch, der macht genau das, was Du ihm gesagt hast. Er ruft die Funktion auf, übergibt einen Parameter, liest die Datei ein und das war's. Keine Ausgabe, kein Rückgabewert.

Was genau der Vorteil von call_user_func() sein könnte weiß ich nicht, daher die althergebrachte und jahrzehntelang erprobte Methode:function getdata($file) {
$file1 = fopen($file, "r+");
$string = chop(fgets($file1, 1024));
$data = explode("|", $string);
return $data;
}

$data=getdata('counterdata.txt'); Ich glaube aber nicht, dass Dir das Ergebnis gefallen wird, da bei Dir momentan $data immer wieder überschrieben wird und somit nur die letzte Zeile enthalten sein wird. Und die ist leer.

nivram
23.07.2003, 17:02:18
Meinst du wegen fgets?
Ich hab voll kein Plan was fgets genau macht! Liest es die komplette Datei zeilenweise aus??? Was ist, wenn die datei nur 1 Zeile hat?


Gruß, nivram

Nachtrag:
Deine Version funktioniert! Wahrscheinlich weil die datei nur 1 Zeile hat! Bei mehreren gehts wahrscheinlich nich wa?

c4
23.07.2003, 17:08:54
Na dann gehen wir das Skript mal durch....// funktion getdata deklarieren
// übergebener parameter wird $file zugewiesen
function getdata($file) {
// datei zum lesen öffnen und filehandler $file1 zuweisen
$file1 = fopen($file, "r");
// fgets liest vom filehandler $file1 1024 zeichen aus
// chop entfernt das letzte zeichen - ich empfehle stattdessen trim()
// inhalt dieser 1024 zeichen $string zuweisen
$string = chop(fgets($file1, 1024));
// zeichenkette bei | aufsplitten
$data = explode("|", $string);
return $data;
}

$data=getdata('counterdata.txt'); Reicht das?

nivram
23.07.2003, 17:11:18
Ähmm... schön das du das so ausführlich erklärt hast, aber das wusst ich selbst alles schon.. Wollte nur wissen warum du sagtest $data immer wieder überschrieben wird!!

Meinen Nachtrag hab ich 1 Post über dir geschrieben!


Gruß, nivram

c4
23.07.2003, 17:40:18
Ach so. Naja, hab auch mehr überflogen, als gelesen....
und wie ich jetzt sehe, hab ich sogar beim Skript nicht mitgedacht....

Zu Deinem Nachtrag: Ja, das Skript ist bisher nur für eine Zeile zu gebrauchen. Oder man ruft die Funktion x-mal auf, aber das ist ja Quark.
Willst Du die Zeilen nach dem Funktionsaufruf in einem Array haben? Oder wann genau soll die Funktion genutzt werden?

nivram
23.07.2003, 17:43:31
Ja, es is eine Zeile mit 4 unterschiedlichen Zahlen!
Deswegen will ich sie nach Aufruf in dem Array $data[] haben!
Irgendwie is mir das list mit dem $line usw. nich so ganz geheuer!

Also, wie gesagt, deine Code funzt so bei mir.. Hatte mal was mit dem return gelesen, aber bei selfphp irgendwie nichts gefunden!


Gruß, nivram

c4
23.07.2003, 17:52:20
Irgendwie is mir das list mit dem $line usw. nich so ganz geheuer! Du meinst vermutlich das: while($line=chop(fgets($file, 1024)))
Das bedeutet einfach soviel, wie: lies immer 1024 Zeichen aus, bis das nicht mehr geht. Dieser Ausdruck $line=chop(fgets($file, 1024)) gibt bei Erfolg - also wenn Zeichen zum auslesen vorhanden - true zurück. Wenn nix mehr zum auslesen da ist, dann kommt false und die Schleife bricht ab.

Wenn es wirklich nur eine einzige Zeile ist, dann kannst Du es auch so machen:
$data=explode('|', trim( file('datei.txt') ) );

return gibt den Wert zurück, der dahinter steht. Mehr macht das auch nicht.



Ich hab das Gefühl gnadenlos verwirrend zu sein und Deine Frage habe ich glaube ich auch nicht im geringsten beantwortet. Tschuldigung. :)

nivram
23.07.2003, 18:02:40
Mhmm, wenn man das so betrachtet! Sieht ja doch ansprechend aus :)
Is aber glaub ich kein Vor- oder Nachteil hingegen der Sache mit file oder? Mensch, sowas muss man doch mal untersuchen ;o)

Glaub mir, du beantwortest mir die Fragen immer am "kommentiertesten" und einfachsten!!

GROßES LOB und DANK!


Gruß, nivram

c4
23.07.2003, 18:39:33
Hab das mit file() und fopen() mal getestet: http://www.selfphp.com/forum/showthread.php?postid=29940#post29940


Ansonsten: Kein Problem. :)