XHTMLforum

XHTMLforum (http://xhtmlforum.de/index.php)
-   Serveradministration und serverseitige Scripte (http://xhtmlforum.de/forumdisplay.php?f=80)
-   -   PHP, Dateien auswerten und Zeit? (http://xhtmlforum.de/showthread.php?t=58704)

laborix 05.10.2009 18:58

PHP, Dateien auswerten und Zeit?
 
Hallo zusammen,

zuerst mal, ich bin Einsteiger was PHP angeht, aber ich würde gerne folgendes richtig begreifen.

Ich lese mit PHP eine Logdatei aus, die 240.000 Zeilen umfasst und eine Größe von 56MB hat. Hintergrund: Abfrage von 70 verschiedenen Browser mit IP-Prüfung.

Zum Auswerten lese ich diese Datei 1 zu 1 in ein Array ein und starte danach eine Auswertung mit

Code:

if (preg_match($suchmuster, $zeichenkette))
{ treffer++; }

Alles funzt wie ich es erwarte. Baue ich eine Zeitabfrage ein, dann brauche ich bei einer einzigen "preg_match" Auswertung für diese Datei ca. 2 Sekunden zum Auswerten.

Prüfe ich aber mit "if" und "elseif" 70 Fallunterscheidungen ab, brauche ich mehr als 25 Sekunden dafür. Warum?

Code:

if (preg_match($suchmuster0, $zeichenkette))
{ treffer++; }
elseif (preg_match($suchmuster1, $zeichenkette))
{ treffer++; }
...
elseif (preg_match($suchmuster70, $zeichenkette))
{ treffer++; }

Hierzu eine weitere Frage.
Gibt es eine Alternative zu "preg_match" und Array? Laut einiger Foreneinträge ist "preg_match" die schnellste Methode zum Auswerten.

Gumbo 05.10.2009 19:05

Welche Art von Untersuchungen machst du denn? Brauchst du dazu wirklich reguläre Ausdrücke?

Scheppertreiber 05.10.2009 19:19

Es gibt immer verschiedene Arten etwas zu suchen. Einige sind schnell, andere
halt nicht. Wie oft läuft das ? Lohnt eine Optimierung ? Und, woher stammen denn
70 verschiedene Browser ???

laborix 05.10.2009 19:54

Zitat:

Zitat von Gumbo (Beitrag 446991)
Welche Art von Untersuchungen machst du denn?

Die Browser meiner Webseitenbesucher ermitteln. Also folgende Prüfung:

Wenn "Browser X", dann Treffer plus eins. Merke IP-Adresse und erst nachdem IP-Adresse wechselt, zähle erneut Treffer plus eins.
(Nicht ganz astrein, da meine Besucher ab und an mehrere Browser verwenden, also hier die IP-Adresse nicht wechselt. Das ist aber ein anderes Problem :D )



Zitat:

Zitat von Gumbo (Beitrag 446991)
Brauchst du dazu wirklich reguläre Ausdrücke?

Einsteiger :oops: keine Ahnung...

Zitat:

Zitat von Scheppertreiber
Wie oft läuft das ?

Je nachdem, wann es mich interessiert ;)

Zitat:

Zitat von Scheppertreiber
Und, woher stammen denn 70 verschiedene Browser ???

Liegt am Thema meiner Webseite und der bisherigen Auswertung mit "grep", "awk", "sort", "unique" und "wc". Die Konsole hat mir 3 Jahre gute Dienste geleistet, jetzt will ich mehr Details.

Beispiel:
Nehme ich eine simple Auswertung auf den String "Safari", so muss ich vorher 8 Strings (Android, Arora, Iron, Chrome, iPhone, OmniWeb, Origyn Web Browser und Shiira) ausklammern, die sich ebenfalls als Safari ausgeben.

Scheppertreiber 05.10.2009 21:27

Geht es nur um die Anzahl der Zugriffe nac Browsern würde ich aus jeder Zeile
die Browserkennung (steht, glaube ich, in Klammern) isolieren und, wenn sie noch nicht in meiner Liste ist, neu anlegen. Ansonst inkrementieren. Ich wüßte
vorher nicht alle Kennungen. Mal einen Lauf machen und sehen was herauskommt.
(Dürfte in C in 1 sec durch sein, PHP weiß ich nicht).

Pr0g 05.10.2009 21:28

Teste das Script mal auf einem anderen Server, ob dieser ebenfalls so lange braucht.

laborix 06.10.2009 07:50

Zitat:

Zitat von Scheppertreiber (Beitrag 447013)
Geht es nur um die Anzahl der Zugriffe nac Browsern würde ich aus jeder Zeile die Browserkennung (steht, glaube ich, in Klammern) isolieren und, wenn sie noch nicht in meiner Liste ist, neu anlegen.

So einfach geht das nicht, da verschiedene Browser mit zwei Browsernamen in der Browserkennung auftauchen:

Browser Shiira meldet sich mit "Shiira und Safari" als Kennung. Opera kann als "MSIE oder Opera" auftauchen, oder je nachdem welche sonstige ID über das Menu vom Besucher eingestellt wurde. Selbst Firefox ist als Kennung nicht ausreichend, da zum Beispiel der Camino Browser die Strings "Camino und Firefox" enthält. Komplex wird das ganze bei Mobile- oder Smartphones :roll:

Zitat:

Zitat von Pr0g
Teste das Script mal auf einem anderen Server

Ich habe eine Domain, auf einem Webspace, mit Einschränkung auf ein Memory Limit unter 64MB. Somit entfällt diese Testmöglichkeit, da das Logfile im Array knappe 70MB benötigt. Das geht bei mir nur lokal mit XAMPP.

Scheppertreiber 06.10.2009 08:10

Laß doch erstmal die Suche nach bestimmten Broserkennungen weg. Der erste
Schritt wäre das Sammeln und Zählen aller Kennungen. Dann hast Du eine Liste
aller vorkommenden Kennungen.

Das zu analysieren ist erheblich einfacher und es geht Dir keiner verloren.

mantiz 06.10.2009 09:23

Wie sieht denn das Suchmuster und die Zeichenkette aus?

Wie sieht das Script generell aus? Wenn Du möchtest, dann kann ich das Script mal bei mir laufen lassen, 'ne TestDatei müsste ich noch irgendwo auftreiben können. :)
Wieviele Zeilen hat die Datei?

Da ich das Script nicht kenne, stelle würde ich folgendes machen:

- Datei zeilenweise einlesen und nicht auf einem Schlag
- Alle Überprüfungen auf diese eine Zeile direkt nach dem einlesen anwenden
- Im Standard-Log Format steht die Browserkennung in "" eingeschlossen am Ende der Zeile, also würde ich dem RegEx dies auch mitteilen (\".*<browserkennung>.*\"$/is), evtl. bringt dies etwas Zeitersparnis

Scheppertreiber 06.10.2009 09:34

PHP-Code:

char *p, *qbuf[1024], kennung[1024];
FILE *fp;

while( 
fgetsbuf1023fp)){
  if ((
strrchrbuf'\"')) == NULL)
    break;
  *
0;
  if  ((
==  strrchrbuf'\"')) == NULL)
    break;
  
strcpykennungq+1);

  
// Nachsehen ob das schon in der Liste ist.
  // wenn ja: Zähler inkrementieren, wenn nein: neu Anlegen und Zähler := 1


QaD :mrgreen::mrgreen::mrgreen:


Alle Zeitangaben in WEZ +2. Es ist jetzt 20:17 Uhr.

Powered by vBulletin® Version 3.8.11 (Deutsch)
Copyright ©2000 - 2021, vBulletin Solutions, Inc.

© Dirk H. 2003 - 2020