Zugriffsstatistiken

Gumbo

Erfahrenes Mitglied
Ich suche eine Möglichkeit die Aufzeichnungen von Zugriffen zu analysieren.

Genauer gesagt besitzt mein Webspace bereits den Webanalyzer. Dies ist für oberflächliche Analysen zwar ausrechend, doch für umfangreicheren Analysen (z.B. Auf welche Datei wird am häufigsten aus einem bestimmten Verzeichnis verwiesen, welche URL hat darauf verwiesen, und wie viel ‚Traffic‘ verursacht sie monatlich?) ist es nicht zu gebrauchen.
Deshalb suche ich eine – am besten MySQL unterstützte – Möglichkeit, die Zugriffsaufzeichnungen auszuwerten.

Dazu stellen sich mir ein paar Fragen:
  • „Ist soetwas überhaupt sinnvoll, immerhin erreicht die Dateigröße der ‚Logdateien‘ die 30 MB-Grenze und einer Summe von etwa 36 Mio Aufzeichnungen pro Jahr?“ oder
  • „Wie sieht es dann mit der Geschwindigkeit aus?“
Für ein entsprechendes fertiges Skript sowie hilfreiche Kommenrate wäre ich sehr dankbar.
 
Gute Frage wie sich das mit der Logdatei verhält aber ich würde sagen zum Schreiben in die Logdatei sollte das keine Geschwindigkeitseinbussen geben, da die Datenzeilen ja nur angehängt werden.

Aus meiner sicht müsstest du die für die Weblogs selbst ein Analysscript zu schreiben. Dann könntest du es z.b. so machen, jeden Tag per Cronjob die Datei auslesen und wie du es benötigst in die Datenbank speichern. Anschliessend die Log flushen und wenn du die Alten Daten behalten willst, sicherheitshalber in eine gesamtlog anhängen.

Welche Datei und somit welcher Zugriff am meisten Traffic verusacht wird daher schwierig, wel du dazu wissen müsstest, welche Datei welche Bilder etc einbindet. Ansonsten kannst du ja einmal zu jeder Datei die in der DB gelistet ist die entsprechende Grösse anpassen....
 
Die „Logdateien“ werden vom Webserver dynamisch erzeugt, welche dem Apache „Combined Log Format“ ensprechen.

Nun habe ich ein Skript geschrieben, welches die Zugriffseinträge ausliest und verarbeitet. Lokal benötigt das Skript etwa 0.11 Sekunden für 480 Einträgen, welche ca. 14 Minuten entsprechen. Gibt es eine Möglichkeit dieses Skript zu optimieren?
PHP:
<?php
  function from_apachedate($date) {
    list($d, $M, $y, $h, $m, $s, $z) = sscanf($date, '%2d/%3s/%4d:%2d:%2d:%2d %5s');
    return date('YmdHis', strtotime("$d $M $y $h:$m:$s $z"));
  }

  $i = 0;
  $sum = 0;
  $log = array(
    'REMOTE_ADDR' => array(),
    'DATE' => array(),
    'REQUEST_METHOD' => array(),
    'REQUEST_URI' => array(),
    'HTTP_STATUS' => array(),
    'HTTP_SIZE' => array(),
    'HTTP_USER_AGENT' => array()
  );

  $start = getmicrotime();
  $filecontents = explode(chr(13), file_get_contents('access.log'));

  foreach($filecontents as $record) {
    if( preg_match('!^([^ ]+) ([^ ]+) ([^ ]+) \[([^\]]+)\] "([^ ]+) ([^ ]+) ([^/]+)/([^"]+)" ([^ ]+) ([^ ]+) "([^ ]+)" "(.+)"!', $record, $temp)) {
      $log['REMOTE_ADDR'][] = trim($temp[1]);
      $log['DATE'][] = from_apachedate($temp[4]);
      $log['REQUEST_METHOD'][] = $temp[5];
      $log['REQUEST_URI'][] = $temp[6];
      $log['HTTP_STATUS'][] = $temp[9];
      $log['HTTP_SIZE'][] = (int)$temp[10];
      $log['HTTP_REFERER'][] = $temp[11];
      $log['HTTP_USER_AGENT'][] = $temp[12];
      $sum += (int)$temp[10];

    }
    $i++;
  }
  $end = getmicrotime();
  echo ($end-$start).' Sekunden für '.$i.' Einträge in einer Zeitspanne von '.(int)(($log['DATE'][($i-1)]-$log['DATE'][0])/60).' Minuten ('.(int)($i/(($log['DATE'][($i-1)]-$log['DATE'][0])/60/60)).'Anfragen/Stunde erg. '.(int)($sum/1024/1024).' MB)';
  echo '<pre>';
  print_r($log);
  echo '</pre>';
?>
 
Versuchen könntest du mal ne while-Schleife statt der foreach, da letztere mit lokalen kopien arbeitet.
Vielleicht könntest du die Datei auch zeilenweise einlesen mit fopen und fgets
statt die Datei einzulesen und dann wieder in die Zeilen zu splitten.
Und Dein if eben in der Schleife zum Auslesen der Datei mit ausführen.

Was mit noch einfällt wäre das Weglassen der Funktion from_apachedate. Einfahc mla nur zum test.... da diese Zeitrumrechnrei doch Zeitaufwendig werden kann.
 
Danke für deinen Beitrag. Dennoch hat er nicht weiterhelfen können.

Die von dir erwähnten Methoden haben keinen nennenswerten Zeitgewinn, wenn nicht sogar einen Zeitverlust gebracht. Was die from_apachedate Funktion angeht, bringt sie weggelassen zwar einen Geschwindigkeitsgewinn von etwa 20%, jedoch kann ich mit den nicht formatierten Daten in einer Datenbank nichts anfangen, oder liege ich hier falsch?
 
Schadö...

Wegen dem Datum du willst es doch Später in die DB-Speichern oder?
Um die Rechenzeit zu verteilen kannst du ja ggf. mal schauen was mysql für Datumsfunktionen beim Einlesen hat?
 
Hm, danach habe ich auch bereits gesucht, hab aber nichts entsprechendes gefunden.

Gibt es eine Möglichkeit, den regulären Ausdruck zu optimieren?
 
Zurück