Der Traffic wird anhand der log-Datei des Apacheservers berechnet und ausgegeben.
Ich werde euch vier Versionen meines Trafficskripts, welches ich auf Anfrage von CrunkBass geschrieben habe, zeigen und erklären.
Der Thread zu diesem Tutorial ist dieser:
http://www.cybton.com/view_thread,PHP-Script-um-Trafficanzeige-in-Homepage-einzubinden,18990,6.html
Die vier Versionen haben folgende Eigenschaften:
-
Skript 1: Gibt den Gesamttraffic jedes Jahres, jeden Monat und jeden Tag in Bytes, Kilobytes, Megabytes und Gigabytes aus.
-
Skript 2: Dies gibt nur den Gesamttraffic des laufenden Jahres, Monates und Tages aus. (Jahr in Gigabyte, Monat und Tag in Megabyte)
-
Skript 3: Da bei der Berechnung eine Menge Leistung "gefressen" wird speichert das Skript 3 den Traffic in eine MySQL-Tabelle und nur bei Bedarf, werden dann die aktuellen Daten berrechnet werden.
-
Skript 4: Um die Performanceeinußen auf ein Minimalstes zu bringen, wird der Traffic jeden Tages in Skript 4 zusammengefasst und in eine MySQL-Tabelle gespeichert und nur der Tag, der noch nicht vorbei ist, wird beim nächsten Aufruf neuberechnet.
Bevor es losgeht zweige ich euch noch eine Bespiel log-Datei eines Apacheservers (hier aus der XAMPP Version 1.4.15 ):
PHP:1
2
|
127.0.0.1 [1/Apr/2006:00:00:01 +0100] "GET /index.html HTTP/1.1" 200 1031 |
Die Logsatei ist dabei folgendermaßen aufgebaut:
IP [Datum Uhrzeit Zeitverschiebung] "Befehl URL Request" Statusmeldung Größe
Das mache ich mir hier zu nutze.
Noch eine wichtige Anmerkung von CrunkBass:
-----------------------------------------------------------------------------------------------------------
Wenn man den Apache Server ohne XAMPP laufen hat muss man folgende Einträge in der httpd.conf änder, weil sonst die Log Datei bei jedem Neustart des Servers auch wieder neu gestartet wird.
# ExtendedStatus controls whether Apache will generate "full" status
# information (ExtendedStatus On) or just basic information (ExtendedStatus
# Off) when the "server-status" handler is called. The default is Off.
#
#ExtendedStatus On
DAS # MUSS ENTFERNT WERDEN!
Und dann muss man noch folgendes ändern:
# Allow server status reports, with the URL of
http://servername/server-status
# Change the ".yourdomain.com" to match your domain to enable.
#
#<Location/server-status>
# SetHandler server-status
# Order deny, allow
# Deny from all
# Allow from .yourdomain.com
#</Location>
DAS MUSS DANN SO AUSSEHEN:
# Allow server status reports, with the URL of
http://servername/server-status
# Change the ".yourdomain.com" to match your domain to enable.
#
<Location/server-status>
SetHandler server-status
Order deny, allow
Deny from all
Allow from all
</Location>
Skript 1:
-----------------------------------------------------------------------------------------------------------
Der Anfang besteht nur aus dem Pfad der Log-Datei und dessen Auffinden und das gleichzeitige hineinladen in das Array $datei.
PHP:1
2
3
4
|
<?PHP
$pfad = "file:///C:/Programme/XAMPP/xampp/apache/logs/access.log";
if (!$datei = @file($pfad)) die("Die Datei konnte nicht gefunden werden!"); |
Danach erfolgt das Deklarieren der Muster, die ich auf die Log-Datei, wie oben zu sehen, zugeschnitten habe.
PHP:1
2
3
4
|
$i = 0;
$muster_datum = "\[([0-9]{2})\/([A-Za-z]{3})\/([0-9]{4})\:([0-9]{2})\:([0-9]{2})\:([0-9]{2})";
$muster_bytes = "([0-9]{3}) ([^\\[]*)\n"; |
Jetzt werden die Daten in zwei Arrays gespeichert. Ein Array ist für das Datum und die Uhrzeit verantwortlich, das Zweite für die Bytesanzahl.
PHP:1
2
3
4
5
6
7
|
foreach ($datei as $eintrag)
{
eregi($muster_datum,$eintrag,$array_datum[$i]);
eregi($muster_bytes,$eintrag,$array_bytes[$i]);
$i++;
} |
Dann kommt unwichtiger HTML Krams
PHP:1
2
3
4
5
6
|
echo "<html>\n<head>\n<title>Trafficübersicht</title>\n</head>\n<body>\n";
echo "<h1>Trafficübersicht</h1>\n";
echo "<h2>Traffic pro Jahr</h2>\n";
echo "<table border=\"1\">\n";
echo "<tr><th>Jahr</th><th>Traffic in Bytes</th><th>Traffic in KBytes</th><th>Traffic in MBytes</th><th>Traffic in GBytes</th></tr>\n"; |
Dann wird es auch schon komplizierter. Die erste Verarbeitung des Traffics pro Jahr.
(Zur Info: Da ich bei dem Muster mehrere Klammer verwendet habe, wurden die einzelnen gefundenen "Stücke" in jeweils eine Spalte des Arrays geschrieben. Daher ist das Jahr in $array_datum[$j][3], der Monat in $array_datum[$j][2] und der Tag in $array_datum[$j][1] gespeichert. )
Das Ergebnis lade ich in zwei neue Arrays ($jahr und $bytes_jahr). Mit der for-Schleife arbeite ich alle Einträge ab. Als erstes prüfe ich den Eintrag, ob er ein anderes Jahr hat als der Vorherige. Ist dem so, wird erst einmal das Vorjahr in der Variable $jahr gespeichert und danach wird der Variable $x ein dazugezählt, wodurch die folgenden Einträge ins nächste Jahr eingetragen werden. Dann wird nur noch geprüft ob die Bytesangabe kein "-" (Minus) ist, da sonst Integerwerten ein String dazugezählt würde. Am Schluß wird nur noch das Vorjahr für den nächsten Eintrag in die Variable $vorjahr geschrieben.
PHP:1
2
3
4
5
6
7
8
9
10
11
12
|
$x = 0;
for ($j = 0; $j <= $i; $j++)
{
if ($vorjahr != $array_datum[$j][3])
{
$jahr[$x] = $vorjahr;
$x++;
}
if ($array_bytes[$j][2] != "-") $bytes_jahr[$x] = $bytes_jahr[$x] + $array_bytes[$j][2];
$vorjahr = $array_datum[$j][3];
} |
Da alle Jahre ausgegeben werden sollen, kommt eine nächste for-Schleife. Hier wird dann jedes Jahr ausgegeben, welches mehr als 0 Bytes besitzt. Die Bytesanzahl werden dann nur noch ausgegeben und für die Umrechnung auf Kilobytes, Megabytes und Gigabytes geteilt und auf zwei Stellen hinter dem Komma per round()-Befehl gerundet.
PHP:1
2
3
4
5
6
7
8
9
|
for ($x = 0; $x <= $y; $x++)
{
if ($bytes_jahr[$x] > 0)
{
echo "<tr><td>".$jahr[$x]."</td>";
echo "<td>".$bytes_jahr[$x]."</td><td>".round(($bytes_jahr[$x]/1024),2)."</td><td>".round(($bytes_jahr[$x]/1048576),2)."</td><td>".round(($bytes_jahr[$x]/1073741824),2)."</td></tr>\n";
}
} |
Die Schleifen für den Traffic pro Monat und Tag gleichen sich mit der vom Jahr. Nur kommen noch weitere Angaben in die if-Abfrage ( if ($vorjahr != $array_datum[$j][3]) ) dazu.
PHP:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
|
echo "</table>";
echo "<h2>Traffic pro Monat</h2>\n";
echo "<table border=\"1\">\n";
echo "<tr><th>Jahr</th><th>Monat</th><th>Traffic in Bytes</th><th>Traffic in KBytes</th><th>Traffic in MBytes</th><th>Traffic in GBytes</th></tr>\n";
$x = 0;
for ($j = 0; $j <= $i; $j++)
{
if ($vorjahr != $array_datum[$j][3] or $vormonat != $array_datum[$j][2])
{
$jahr[$x] = $vorjahr;
$monat[$x] = $vormonat;
$x++;
}
if ($array_bytes[$j][2] != "-") $bytes_monat[$x] = $bytes_monat[$x] + $array_bytes[$j][2];
$vorjahr = $array_datum[$j][3];
$vormonat = $array_datum[$j][2];
}
$y = $x;
for ($x = 0; $x <= $y; $x++)
{
if ($bytes_monat[$x] > 0)
{
echo "<tr><td>".$jahr[$x]."</td><td>".$monat[$x]."</td>\n";
echo "<td>".$bytes_monat[$x]."</td><td>".round(($bytes_monat[$x]/1024),2)."</td><td>".round(($bytes_monat[$x]/1048576),2)."</td><td>".round(($bytes_monat[$x]/1073741824),2)."</td></tr>\n";
}
}
echo "</table>";
echo "<h2>Traffic pro Tag</h2>\n";
echo "<table border=\"1\">\n";
echo "<tr><th>Jahr</th><th>Monat</th><th>Tag</th><th>Traffic in Bytes</th><th>Traffic in KBytes</th><th>Traffic in MBytes</th><th>Traffic in GBytes</th></tr>\n";
$x = 0;
for ($j = 0; $j <= $i; $j++)
{
if ($vorjahr != $array_datum[$j][3] or $vormonat != $array_datum[$j][2] or $vortag != $array_datum[$j][1])
{
$jahr[$x] = $vorjahr;
$monat[$x] = $vormonat;
$tag[$x] = $vortag;
$x++;
}
if ($array_bytes[$j][2] != "-") $bytes_tag[$x] = $bytes_tag[$x] + $array_bytes[$j][2];
$vorjahr = $array_datum[$j][3];
$vormonat = $array_datum[$j][2];
$vortag = $array_datum[$j][1];
}
$y = $x;
for ($x = 0; $x <= $y; $x++)
{
if ($bytes_tag[$x] > 0)
{
echo "<tr><td>".$jahr[$x]."</td><td>".$monat[$x]."</td><td>".$tag[$x]."</td>\n";
echo "<td>".$bytes_tag[$x]."</td><td>".round(($bytes_tag[$x]/1024),2)."</td><td>".round(($bytes_tag[$x]/1048576),2)."</td><td>".round(($bytes_tag[$x]/1073741824),2)."</td></tr>\n";
}
}
echo "</table>\n";
echo "</body>\n</head>\n";
//Made by Teetasse aka The Rock aka Chris Marquardt 26.04.2006 18:08
//Copyright (C) by Chris Marquardt 2006
?> |
Skript 2:
-----------------------------------------------------------------------------------------------------------
Soll nur der Traffic des laufenden Jahres, Monates, Tages angezeigt ist das Skript wesentlich einfacher.
Erst einmal kommt wieder das einlesen der Daten wie beim Skript 1 und der HTML-Kram. Es muss nur beachtet werden, dass das Array vorher gedreht wurde , muss aber nicht sein.
PHP:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
<?PHP
$pfad = "file:///C:/Programme/XAMPP/xampp/apache/logs/access.log";
if (!$datei = @file($pfad)) die("Die Datei konnte nicht gefunden werden!");
$datei = array_reverse($datei);
$i = 0;
$muster_datum = "\[([0-9]{2})\/([A-Za-z]{3})\/([0-9]{4})\:([0-9]{2})\:([0-9]{2})\:([0-9]{2})";
$muster_bytes = "([0-9]{3}) ([^\\[]*)\n";
foreach ($datei as $eintrag)
{
eregi($muster_datum,$eintrag,$array_datum[$i]);
eregi($muster_bytes,$eintrag,$array_bytes[$i]);
$i++;
}
echo "<html>\n<head>\n<title>Trafficübersicht</title>\n</head>\n<body>\n";
echo "<h1>Trafficübersicht</h1>\n";
echo "<table border=\"0\">\n";
echo "<tr><td>Traffic Jahr:</td>\n"; |
Die erste for-Schleife für das Jahr sieht nun schon wesentlich einfacher aus und besteht nur noch aus einer if-Abfrag, die prüft ob das Datum dem Heutigem entspricht per date("Y")-Befehl und die Byteanzahl kein "-" (Minus) ist. Ein Array wird dabei für das Ergebnis nicht mehr benötigt, da man ja nur noch einen Wert hat.
PHP:1
2
|
for ($j = 0; $j <= $i; $j++) if ($array_bytes[$j][2] != "-" and $array_datum[$j][3] == date("Y")) $bytes_jahr = $bytes_jahr + $array_bytes[$j][2]; |
Die Ausgabe wird dadurch auch vereinfacht und die zweite for-Schleife fällt weg.
PHP:1
2
|
echo "<td>".round(($bytes_jahr/1073741824),2)."GB</td></tr>\n"; |
Für den Monat und das Jahr kommen in die if-Abfrage der for-Schleife nur noch die Werte Monat und Tag zum Vergleich hinzu.
PHP:1
2
3
4
5
6
7
8
9
10
11
12
|
echo "<tr><td>Traffic Monat:</td>\n";
for ($j = 0; $j <= $i; $j++) if ($array_bytes[$j][2] != "-" and $array_datum[$j][3] == date("Y") and $array_datum[$j][2] == date("M")) $bytes_monat = $bytes_monat + $array_bytes[$j][2];
echo "<td>".round(($bytes_monat/1048576),2)."MB</td></tr>\n";
echo "<tr><td>Traffic Tag:</td>\n";
for ($j = 0; $j <= $i; $j++) if ($array_bytes[$j][2] != "-" and $array_datum[$j][3] == date("Y") and $array_datum[$j][2] == date("M") and $array_datum[$j][1] == date("d")) $bytes_tag = $bytes_tag + $array_bytes[$j][2];
echo "<td>".round(($bytes_tag/1048576),2)."MB</td></tr>\n";
echo "</table><br><br>\n";
echo "</body>\n</head>\n";
//Made by Teetasse aka The Rock aka Chris Marquardt 26.04.2006 18:09
//Copyright (C) by Chris Marquardt 2006
?> |
Skript 3:
-----------------------------------------------------------------------------------------------------------
Skript 3 beinhaltet das Skript 2 plus einer zusätzlichen Funktion. Durch das Hinzufüger der MySQL-Daten wie Host, Passwort etc. und dies auch in der install.php gebraucht wird, habe ich mich entschieden den Pfad und alle anderen Angaben in eine config.php zu schreiben. Deswegen muss der Anfang von Skript 2
PHP:1
2
|
$pfad = "file:///C:/Programme/XAMPP/xampp/apache/logs/access.log"; |
mit Folgendem überschrieben werden.
PHP:1
2
|
include("config.php"); |
Die config.php muss dann nur noch mit seinen Daten "gefüttert" werden.
PHP:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
<?PHP
$host = "localhost";
$user = "root";
$passwort = "";
$datenbank = "";
$tabelle = "traffic";
$pfad = "file:///C:/Programme/XAMPP/xampp/apache/logs/access.log";
if(!@mysql_connect("$host","$user","$passwort")) die("Die Verbindung zum Server konnte nicht hergestellt werden!");
if(!@mysql_select_db("$datenbank")) die("Die Verbindung zur Datenbank konnte nicht hergestellt werden!");
?> |
Die Trafficdaten werden in folgender Tabelle eingetragen und mit einem 2. Skript aufgerufen. Dies ist auch gleichzeitig das install.php-Skript, welches ausgeführt die Tabelle nach der config.php erstellt.
PHP:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
<?PHP
include("config.php");
$query = "CREATE TABLE `".$datenbank."`.`".$tabelle."` (
`id` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
`datum` DATETIME NOT NULL,
`jahr` FLOAT NOT NULL,
`monat` FLOAT NOT NULL,
`tag` FLOAT NOT NULL,
PRIMARY KEY(`id`)
)
TYPE = MYISAM;";
if(!@mysql_query($query)) die("Die Tabelle konnte <b>NICHT</b> erstellt werden!");
else echo "Die Tabelle konnte erstellt werden!";
?> |
In das Skript 2 kommen dann nur noch folgende Zeilen hinzu. Der erste MySQL-Query löscht alle vorhanden Daten und der Zweite trägt die Neuen in die Tabelle ein.
PHP:1
2
3
4
5
6
7
|
$query = "DELETE FROM ".$tabelle." WHERE id > 0;";
if(!@mysql_query($query)) die("Die alten Daten konnten <b>NICHT</b>gelöscht werden!<br>\n");
else echo "<small>Die alten Daten konnten gelöscht werden!</small><br>\n";
$query = "INSERT INTO ".$tabelle." (datum, jahr, monat, tag) VALUES ('".date("Y-m-d H:i:s")."', ".($bytes_jahr/1073741824).", ".($bytes_monat/1048576).", ".($bytes_tag/1048576).");";
if(!@mysql_query($query)) die("Die Daten konnten <b>NICHT</b> in die Tabelle geschrieben werden!<br>\n");
else echo "<small>Die Daten konnten in die Tabelle geschrieben werden!</small><br>\n"; |
Die fertige Datei sieht dann folgendermaßen aus.
PHP:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
<?PHP
include("config.php");
if (!$datei = @file($pfad)) die("Die Datei konnte nicht gefunden werden!");
$datei = array_reverse($datei);
$i = 0;
$muster_datum = "\[([0-9]{2})\/([A-Za-z]{3})\/([0-9]{4})\:([0-9]{2})\:([0-9]{2})\:([0-9]{2})";
$muster_bytes = "([0-9]{3}) ([^\\[]*)\n";
foreach ($datei as $eintrag)
{
eregi($muster_datum,$eintrag,$array_datum[$i]);
eregi($muster_bytes,$eintrag,$array_bytes[$i]);
$i++;
}
echo "<html>\n<head>\n<title>Trafficübersicht</title>\n</head>\n<body>\n";
echo "<h1>Trafficübersicht</h1>\n";
echo "<table border=\"0\">\n";
echo "<tr><td>Traffic Jahr:</td>\n";
for ($j = 0; $j <= $i; $j++) if ($array_bytes[$j][2] != "-" and $array_datum[$j][3] == date("Y")) $bytes_jahr = $bytes_jahr + $array_bytes[$j][2];
echo "<td>".round(($bytes_jahr/1073741824),2)."GB</td></tr>\n";
echo "<tr><td>Traffic Monat:</td>\n";
for ($j = 0; $j <= $i; $j++) if ($array_bytes[$j][2] != "-" and $array_datum[$j][3] == date("Y") and $array_datum[$j][2] == date("M")) $bytes_monat = $bytes_monat + $array_bytes[$j][2];
echo "<td>".round(($bytes_monat/1048576),2)."MB</td></tr>\n";
echo "<tr><td>Traffic Tag:</td>\n";
for ($j = 0; $j <= $i; $j++) if ($array_bytes[$j][2] != "-" and $array_datum[$j][3] == date("Y") and $array_datum[$j][2] == date("M") and $array_datum[$j][1] == date("d")) $bytes_tag = $bytes_tag + $array_bytes[$j][2];
echo "<td>".round(($bytes_tag/1048576),2)."MB</td></tr>\n";
echo "</table><br><br>\n";
$query = "DELETE FROM ".$tabelle." WHERE id > 0;";
if(!@mysql_query($query)) die("Die alten Daten konnten <b>NICHT</b>gelöscht werden!<br>\n");
else echo "<small>Die alten Daten konnten gelöscht werden!</small><br>\n";
$query = "INSERT INTO ".$tabelle." (datum, jahr, monat, tag) VALUES ('".date("Y-m-d H:i:s")."', ".($bytes_jahr/1073741824).", ".($bytes_monat/1048576).", ".($bytes_tag/1048576).");";
if(!@mysql_query($query)) die("Die Daten konnten <b>NICHT</b> in die Tabelle geschrieben werden!<br>\n");
else echo "<small>Die Daten konnten in die Tabelle geschrieben werden!</small><br>\n";
echo "</body>\n</head>\n";
?> |
Ich hab diese Datei update.php genannt, damit man den Link in der nachfolgenden Datei wiedererkennt. Diese Datei (anzeige.php genannt) gibt die zur Zeit eingetragenden Trafficdaten aus und beinhaltet einen Link zum Updateskript.
PHP:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
<?PHP
include("config.php");
$query = "SELECT * FROM ".$tabelle.";";
if(!$ergebnis = @mysql_query($query)) die("Die Daten konnten <b>NICHT</b>abgefragt werden!<br>\n");
$row = mysql_fetch_array($ergebnis);
$muster = "([0-9]{4})-([0-9]{2})-([0-9]{2}) ([0-9]{2}):([0-9]{2}):([0-9]{2})";
eregi($muster,$row['datum'],$datum);
echo "<html>\n<head>\n<title>Trafficübersicht</title>\n</head>\n<body>\n";
echo "<h1>Trafficübersicht</h1>\n";
echo "<table border=\"0\">\n";
echo "<tr><td>Daten vom:</td>\n";
echo "<td>".$datum[3].".".$datum[2].".".$datum[1]." um ".$datum[4].":".$datum[5].":".$datum[4]."</td></tr>\n";
echo "<tr><td>Traffic Jahr:</td>\n";
echo "<td>".round($row['jahr'],2)."GB</td></tr>\n";
echo "<tr><td>Traffic Monat:</td>\n";
echo "<td>".round($row['monat'],2)."MB</td></tr>\n";
echo "<tr><td>Traffic Tag:</td>\n";
echo "<td>".round($row['tag'],2)."MB</td></tr>\n";
echo "</table><br><br>\n";
echo "<a href=\"update.php\">Aktualisieren der Daten...</a>\n";
echo "</body>\n</html>\n";
?> |
Skript 4:
-----------------------------------------------------------------------------------------------------------
Wie schon oben erwähnt, werden bei dieser Version der Traffic pro Tag in eine MySQL-Tabelle geschrieben. Diese beinhaltet folgende Spalten: Jahr, Monat, Tag, Logeinträge, Bytes, Abgeschlossen. In Logeinträge wird die Anzahl der Einträge des Tages gespeichert, damit später berechnet werden kann, wo das Skript beim erneuten Aufruf anfangen muss zu arbeiten. In Bytes wird der Traffic des Tages gespeichert und Abgeschlossen markiert, ob der Tag schon abgeschlossen ist oder nicht und damit, ob beim erneuten Aufruf dieser Tag nochmal neu berechnet werden muss.
Die config.php sieht eigentlich genau so aus wie beim Skript 3:
PHP:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
<?PHP
$host = "localhost";
$user = "root";
$passwort = "pw";
$datenbank = "db";
$tabelle = "traffic2";
$pfad = "file:///C:/Programme/XAMPP/xampp/apache/logs/access.log";
if(!@mysql_connect("$host","$user","$passwort")) die("Die Verbindung zum Server konnte nicht hergestellt werden!");
if(!@mysql_select_db("$datenbank")) die("Die Verbindung zur Datenbank konnte nicht hergestellt werden!");
?> |
Die install.php zum Installieren der MySQL-Tabelle:
PHP:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
<?PHP
include("config.php");
$query = "CREATE TABLE `".$datenbank."`.`".$tabelle."` (
`jahr` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
`monat` VARCHAR(3) NOT NULL,
`tag` INTEGER UNSIGNED NOT NULL,
`logeintraege` INTEGER UNSIGNED NOT NULL,
`bytes` BIGINT UNSIGNED NOT NULL,
`abgeschlossen` TINYINT(1) UNSIGNED NOT NULL,
PRIMARY KEY(`jahr`, `monat`, `tag`)
)
TYPE = MYISAM;";
if(!@mysql_query($query)) die("Die Tabelle konnte <b>NICHT</b> erstellt werden!");
else echo "Die Tabelle konnte erstellt werden!";
?> |
Der Anfang der update.php, in dem als erstes die config.php includet wird und eine erste Anfrage an den MySQL-Server gesendet wird um zu erfahren, ab wo das Skript die access.log durchsuchen soll. Danach wird die log-Datei geladen und es wird geprüft, ob der SQL-Query ein Ergebnis brachte oder ob das Skript von Vorne anfangen soll.
PHP:1
2
3
4
5
6
7
8
9
10
11
12
13
|
<?PHP
include("config.php");
$query = "SELECT SUM(logeintraege) AS cid FROM ".$tabelle." WHERE abgeschlossen = 1;";
$result = mysql_query($query);
$row = @mysql_fetch_array($result);
if (!$datei = @file($pfad)) die("Die Datei konnte nicht gefunden werden!");
if ($row['cid'] == "") $cid = 0;
else $cid = $row['cid']; |
Als Nächstes kommt dann auch schon das Herzstück des Skriptes, die Schleife zum Auslesen der log-Datei. Die $i Variabel ist dabei der Anzeiger der aktuellen Zeile in der log-Datei. Die $x Variabel dient dagegen für die Anzahl der Tage.
Am Anfang der Schleife erkennt man das typische Vergleichen der Einträge und das Hineinschreiben in zwei Arrays.
PHP:1
2
3
4
5
6
7
8
9
10
|
$x = 0;
for($i=$cid; $i <= sizeof($datei); $i++)
{
$muster_datum = "\[([0-9]{2})\/([A-Za-z]{3})\/([0-9]{4})\:([0-9]{2})\:([0-9]{2})\:([0-9]{2})";
$muster_bytes = "([0-9]{3}) ([^\\[]*)\n";
eregi($muster_datum,$datei[$i],$array_datum[$i]);
eregi($muster_bytes,$datei[$i],$array_bytes[$i]); |
Danach erfolgt erst einmal das Überprüfen, ob in der log-Datei ein Minus anstatt der Bytesanzahl steht und wandelt dieses gegebenenfalls in eine Null um. Danach kommt eine if-Abfrage, ob es sich um einen anderen Tag handelt als der letzte Eintrag. Ist dem so, wird die Taganzahl-Variable $x um 1 erhöht. Darauf folgt die Abfrage, ob dem aktuellen Tag-Eintrag ein Jahr, Monat und Tag zugeordnet wurde. Nun werden die Bytes zu den schon vorhandenen Bytes dazugerechnet und am Schluß werden die Variablen mit dem Datum gefüttert für den nächsten Eintrag. Die Variable für die Logeinträge pro Tag wird zuletzt um 1 erhöht.
PHP:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
if ($array_bytes[$i] == "-") $array_bytes[$i] = 0;
if ($jahr_davor != $array_datum[$i][3] or $monat_davor != $array_datum[$i][2] or $tag_davor != $array_datum[$i][1]) $x++;
if ($jahr[$x] == "" or $monat[$x] == "" or $tag[$x] == "")
{
$jahr[$x] = $array_datum[$i][3];
$monat[$x] = $array_datum[$i][2];
$tag[$x] = $array_datum[$i][1];
}
$bytes[$x] = $bytes[$x] + $array_bytes[$i][2];
$jahr_davor = $array_datum[$i][3];
$monat_davor = $array_datum[$i][2];
$tag_davor = $array_datum[$i][1];
$anzahl[$x]++;
} |
Nach dem Auslesen der Datei und den Eintragen der Werte in Tage werden nun diese Daten in die MySQL-Tabelle geschrieben.
Vorher wird noch das Datum des Eintrages bestimmt, welcher noch nicht abgeschlossen ist, um diesen später nur zu editieren und nicht neu anzulegen (was der MySQL-Server gar nicht zulässt, weil die Spalten Jahr, Monat und Tag die Primärschlüssel sind).
PHP:1
2
3
4
|
$query = "SELECT jahr, monat, tag FROM ".$tabelle." WHERE abgeschlossen = 0;";
$result = mysql_query($query);
$row = @mysql_fetch_array($result); |
Als erstes wird geprüft, ob das Datum des nicht abgeschlossenen Tages mit dem des derzeitig in der Schleife befindeten Eintrages übereinstimmt. Ist dies der Fall wird weiterhin geprüft ob es der letzte Eintrag des Arrays ist und damit ob abgeschlossen gleich 1 oder 0 gesetzt werden muss. Das Gleiche passiert auch nochmal mit Einträgen, die noch nicht in der Datenbank vorhanden sind.
PHP:1
2
3
4
5
6
7
8
9
10
11
12
13
14
| for ($x=1; $x <= (sizeof($bytes)-1); $x++)
{
if ($row['jahr'] == $jahr[$x] and $row['monat'] == $monat[$x] and $row['tag'] == $tag[$x])
{
if ($x != (sizeof($bytes)-1)) $query = "UPDATE ".$tabelle." SET logeintraege = ".$anzahl[$x].", bytes = ".$bytes[$x].", abgeschlossen = 1 WHERE jahr = '".$jahr[$x]."' and monat = '".$monat[$x]."' and tag = '".$tag[$x]."';";
else $query = "UPDATE ".$tabelle." SET logeintraege = ".$anzahl[$x].", bytes = ".$bytes[$x]." WHERE jahr = '".$jahr[$x]."' and monat = '".$monat[$x]."' and tag = '".$tag[$x]."';";
}
else
{
if ($x != (sizeof($bytes)-1)) $query = "INSERT INTO ".$tabelle." (jahr, monat, tag, logeintraege, bytes, abgeschlossen) VALUES ('".$jahr[$x]."', '".$monat[$x]."', '".$tag[$x]."', ".$anzahl[$x].", ".$bytes[$x].", 1);";
else $query = "INSERT INTO ".$tabelle." (jahr, monat, tag, logeintraege, bytes, abgeschlossen) VALUES ('".$jahr[$x]."', '".$monat[$x]."', '".$tag[$x]."', ".$anzahl[$x].", ".$bytes[$x].", 0);";
}
mysql_query($query);
} |
Danach kommt nur noch die Ausgabe der aktuellen Daten aus der MySQL-Tabelle.
PHP:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
echo "<html>\n<head>\n<title>Trafficübersicht</title>\n</head>\n<body>\n";
echo "<h1>Trafficübersicht</h1>\n";
echo "<table border=\"0\">\n";
echo "<tr><td>Traffic Jahr:</td>\n";
$query = "SELECT SUM(bytes) FROM ".$tabelle." WHERE jahr = '".date("Y")."';";
$result = mysql_query($query);
$row = @mysql_fetch_array($result);
echo "<td>".round(($row['SUM(bytes)']/1073741824),2)."GB</td></tr>\n";
echo "<tr><td>Traffic Monat:</td>\n";
$query = "SELECT SUM(bytes) FROM ".$tabelle." WHERE jahr = '".date("Y")."' AND monat = '".date("M")."';";
$result = mysql_query($query);
$row = @mysql_fetch_array($result);
echo "<td>".round(($row['SUM(bytes)']/1073741824),2)."GB</td></tr>\n";
echo "<tr><td>Traffic Tag:</td>\n";
$query = "SELECT SUM(bytes) FROM ".$tabelle." WHERE jahr = '".date("Y")."' AND monat = '".date("M")."' AND tag = '".date("d")."';";
$result = mysql_query($query);
$row = @mysql_fetch_array($result);
echo "<td>".round(($row['SUM(bytes)']/1048576),2)."MB</td></tr>\n";
echo "</table>\n";
echo "</body>\n</html>\n";
//Made by Teetasse aka The Rock aka Chris Marquardt 10.05.2006 22:38
//Copyright (C) by Chris Marquardt 2006
?> |
Und nochmal zur Übersicht ist hier das komplette update Skript:
PHP:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
|
<?PHP
include("config.php");
$query = "SELECT SUM(logeintraege) AS cid FROM ".$tabelle." WHERE abgeschlossen = 1;";
$result = mysql_query($query);
$row = @mysql_fetch_array($result);
if (!$datei = @file($pfad)) die("Die Datei konnte nicht gefunden werden!");
if ($row['cid'] == "") $cid = 0;
else $cid = $row['cid'];
$x = 0;
for($i=$cid; $i <= sizeof($datei); $i++)
{
$muster_datum = "\[([0-9]{2})\/([A-Za-z]{3})\/([0-9]{4})\:([0-9]{2})\:([0-9]{2})\:([0-9]{2})";
$muster_bytes = "([0-9]{3}) ([^\\[]*)\n";
eregi($muster_datum,$datei[$i],$array_datum[$i]);
eregi($muster_bytes,$datei[$i],$array_bytes[$i]);
if ($array_bytes[$i] == "-") $array_bytes[$i] = 0;
if ($jahr_davor != $array_datum[$i][3] or $monat_davor != $array_datum[$i][2] or $tag_davor != $array_datum[$i][1]) $x++;
if ($jahr[$x] == "" or $monat[$x] == "" or $tag[$x] == "")
{
$jahr[$x] = $array_datum[$i][3];
$monat[$x] = $array_datum[$i][2];
$tag[$x] = $array_datum[$i][1];
}
$bytes[$x] = $bytes[$x] + $array_bytes[$i][2];
$jahr_davor = $array_datum[$i][3];
$monat_davor = $array_datum[$i][2];
$tag_davor = $array_datum[$i][1];
$anzahl[$x]++;
}
$query = "SELECT jahr, monat, tag FROM ".$tabelle." WHERE abgeschlossen = 0;";
$result = mysql_query($query);
$row = @mysql_fetch_array($result);
for ($x=1; $x <= (sizeof($bytes)-1); $x++)
{
if ($row['jahr'] == $jahr[$x] and $row['monat'] == $monat[$x] and $row['tag'] == $tag[$x])
{
if ($x != (sizeof($bytes)-1)) $query = "UPDATE ".$tabelle." SET logeintraege = ".$anzahl[$x].", bytes = ".$bytes[$x].", abgeschlossen = 1 WHERE jahr = '".$jahr[$x]."' and monat = '".$monat[$x]."' and tag = '".$tag[$x]."';";
else $query = "UPDATE ".$tabelle." SET logeintraege = ".$anzahl[$x].", bytes = ".$bytes[$x]." WHERE jahr = '".$jahr[$x]."' and monat = '".$monat[$x]."' and tag = '".$tag[$x]."';";
}
else
{
if ($x != (sizeof($bytes)-1)) $query = "INSERT INTO ".$tabelle." (jahr, monat, tag, logeintraege, bytes, abgeschlossen) VALUES ('".$jahr[$x]."', '".$monat[$x]."', '".$tag[$x]."', ".$anzahl[$x].", ".$bytes[$x].", 1);";
else $query = "INSERT INTO ".$tabelle." (jahr, monat, tag, logeintraege, bytes, abgeschlossen) VALUES ('".$jahr[$x]."', '".$monat[$x]."', '".$tag[$x]."', ".$anzahl[$x].", ".$bytes[$x].", 0);";
}
mysql_query($query);
}
echo "Die Datenbank wurde geupdatet!";
echo "<html>\n<head>\n<title>Trafficübersicht</title>\n</head>\n<body>\n";
echo "<h1>Trafficübersicht</h1>\n";
echo "<table border=\"0\">\n";
echo "<tr><td>Traffic Jahr:</td>\n";
$query = "SELECT SUM(bytes) FROM ".$tabelle." WHERE jahr = '".date("Y")."';";
$result = mysql_query($query);
$row = @mysql_fetch_array($result);
echo "<td>".round(($row['SUM(bytes)']/1073741824),2)."GB</td></tr>\n";
echo "<tr><td>Traffic Monat:</td>\n";
$query = "SELECT SUM(bytes) FROM ".$tabelle." WHERE jahr = '".date("Y")."' AND monat = '".date("M")."';";
$result = |