PHP-Programmierung – preg_match()
Protokolldatei eines Webservers analysieren

Office-AnwendungenSoftware

Datenverarbeitung ___

Eine weitere interessante Variante der Datenverarbeitung auf dem Server mit Hilfe von PHP ist die Analyse der verschiedenen Protokolldateien, die einWebserver wie zum Beispiel der Apache automatisch pflegt. Mit Hilfe von regulären Ausdrücken können Sie Berechnungen auf der Grundlage von Informationen durchführen, die sich zum Beispiel in der Zugriffs-Protokolldatei Ihres Webservers befinden. Öffnen Sie die Protokolldatei, die Sie analysieren wollen, und verarbeiten Sie die Zeilen mit Hilfe regulärer Ausdrücke, die dem Format der Protokolldatei entsprechen. Der folgende reguläre Ausdruck passt zum NCSA-Combined-Log-Format:

$pattern = ‘/^([^ ]+) ([^ ]+) ([^]+) (\[[^\]]+\]) “(.*) (.*) (.*)”([0-9\-]+) ([0-9\-]+) “(.*)””(.*)”$/’;

Das folgende Beispielprogramm liest dem NCSACombined-Log-Format entsprechende Zeilen und zeigt eine Liste von Seiten an, die nach der Anzahl der Anfragen pro Seite sortiert ist:

$log_file =’/usr/local/apache/logs/access.log’;
$pattern = ‘/^([^ ]+) ([^ ]+) ([^]+) (\[[^\]]+\]) “(.*) (.*) (.*)”([0-9\-]+) ([0-9\-]+) “(.*)””(.*)”$/’;
$fh = fopen($log_file,’r’) or die($php_errormsg);
$i = 1;
$requests = array();
while (! feof($fh)) {
// Zeilen einlesen und führende/nachfolgende Leerzeichen entfernen.
if ($s = trim(fgets($fh,16384))) {
// Das Muster auf die Zeileanwenden.
if (preg_match($pattern,$s,$matches)) {

*/ Jeden übereinstimmenden Teil in einer passend benannten Variablen speichern. */
list($whole_match,$remote_host,
$logname, $user, $time, $method,
$request, $protocol, $status,
$bytes, $referer,$user_agent) =
$matches;
// Zähler für die Anzahl derAnfragen mitführen.
$requests[$request]++;
} else {
// Melden, wenn die Zeile nicht zum Muster passt.
error_log(“Can’t parse line $i:
$s”);
}
}
$i++;
}
fclose($fh) or die($php_errormsg);
// Das Array nach den Anfragezahlen absteigend sortieren.
arsort($requests);
// Ergebnisse formatiert ausgeben.
foreach ($requests as $request =>
$accesses) {
printf(“%6d %s\n”, $accesses,
$request);
}
Das in preg_match() verwendete Muster passt auf Zeilen im Combined-Log-Format wie die folgenden:

10.1.1.162 – david [20/Jul/2001:13:05:02 -0400] “GET /sklar.css HTTP/1.0” 200 278 “-” “Mozilla/4.77 [en] (WinNT; U)”

10.1.1.248 – – [14/Mar/2002:13:31:37 -0500] “GET /php-cookbook/colors.html HTTP/1.1” 200 460 “-” “Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)”

In der ersten Zeile ist 10.1.1.162 die IP-Adresse, von der die Anfrage kam. Abhängig von der Serverkonfiguration kann an deren Stelle auch ein Host-Name stehen. Wenn das Array $matches der Liste einzelner Variablen zugewiesen wird, wirdder Host-Name in $remote_host abgelegt. Der folgende Bindestrich (-) zeigt an, dass der entfernte Host keinen Benutzernamen per identd1 geliefert hat, dementsprechend wird $logname aufgesetzt.

Lesen Sie auch :
Autor: swasi