Pimped Apachestatus - v1.0 released

Dienstag, 20. November, 2012

Viele kennen den Apache Webserver … und dann wohl auch dessen Server-status Seite. Weil man diese HTML-Seite nicht wirklich toll lesen und verwerten kann, habe ich mir ein Tool geschrieben, das diese Seite parst und durch verschiedene Filter gejagt, die verschiedensten Infos als Tabellen darstellt:

  • nur aktive Requests anzeigen
  • häufigste Requests
  • längste Requests
  • u.v.m.

Alle Tabellen sind per Mausklick sortierbar und lassen sich durch Texteingabe filtern.
Die Tabellen lassen sich exportieren, z.B. CSV oder XML.

Das Ganze funktioniert nicht nur mit einem einzelnen Apache-Server - man kann mehrere Apache-Server, die gemeinsam hinter einem Loadbalancer dieselbe Webseite ausliefern, in einer Tabelle zusammenfassen. Die häufigsten oder längsten Requests auf 5 oder 10 Servern zu ermitteln - das ist mit Lesen der Server-Status-Seiten unmöglich - mit meinem Tool wird’s zum Kinderspiel.

Seit einem Jahr sind immer wieder etliche Versionen veröffentlicht wurden, bei denen ich das Gefühl hatte: “Ja eigentlich funktioniert ja alles, wie es soll”.

Heute - ja heute - ist alles anders: mein heutiger Release heisst Version 1.0. Tusch!!!

2012-11-20-pimped-apache-status-was-released.jpg 2012-11-20-pimped-apache-status-worker.jpg 2012-11-20-pimped-apache-status-most-requested.jpg

Weiterführende Links:

PHP-Schnipsel: Hintergrundjobs durch Seitenaufrufe auslösen lassen

Sonntag, 6. März, 2011

Wenn man bei seinem Provider keinen Cronjob einrichten kann, aber genügend Besucher hat, kann man ggf. Hintergrundjobs während der Seitenaufrufe auslösen. Man muss dafür sorgen, dass nicht jeder einzelne Seitenaufruf die Verarbeitung triggert, sondern es soll max alle n Sekunden geschehen.

In PHP definiere ich ein Array mit der Konfiguration und ein Arbeitsverzeichnis. Im Arbeitsverzeichnis wird bei Ausführung eines Jobs eine Datei zum Merken des letzten Ausführungsdatums getoucht (jaja, ein schönes deutsches Wort). Soll derselbe Job erneut ausgeführt werden, wird das Alter der Datei im Arbeitsverzeichnis geprüft. Wenn das Alter Älter als mein definiertes Limit ist, dann wird der Job erneut ausgeführt - ansonsten nicht.

Klingt einfach … - ist es auch ;-)

Voraussetzungen, damit das nachfolgende Beispiel funktioniert:

  • wget muss am Webserver vorhanden sein (alternativ liessen sich auch curl oder lynx verwenden)
  • PHP-Funktion exec muss zugelassen sein
  • getestet wurde es nur mit einem Unix-System als Webserver (für Windows s. Anmerkungen unten)

[Weiterlesen…]

PHP mit Sqlite - mein erster Gehversuch

Donnerstag, 28. Oktober, 2010

Ich habe mal einen Download-Zähler gebaut: mittels .htaccess werden alle Dateizugriffe auf ein PHP-Skript umgebogen, welches einmal die angeforderte Datei ausliefert und den Zugriff protokolliert.

In PHP5 ist Sqlite direkt mitgeliefert. Die Sqlite Datenbank ist eine Textdatei, auf die ohne einen laufenden Server zugegriffen wird. Für kleine Webauftritte, wo das Webroot nicht auf einem NFS- oder SMB-Share liegt, ist dies problemlos.

Der wesentliche Vorteil einer SQl-Datenbank zu einer (CSV-) Textdatei ist die Auswertung der Daten: mit SQL Queries kommt man schnell zu den gewünschten Informationen.

Ich definiere mal in PHP eine Variable mit dem Dateinamen zur Datenbank:

$sqliteDB = $_SERVER['DOCUMENT_ROOT']."/sqlite/downloads.sqlite";

In dieser Datenbank ist - weil es zum Einstieg einfacher ist: mit einem grafischen Tool - eine Tabelle angelegt worden:

CREATE TABLE "downloadcount" (
   "id" INTEGER PRIMARY KEY  AUTOINCREMENT  NOT NULL  UNIQUE ,
  "time" DATETIME,
  "file" TEXT,
  "ext" TEXT,
  "ip" TEXT,
  "referrer" TEXT,
  "usaeragent" TEXT
)

Dann muss man nur noch wissen, welcher Sqlite Treiber beim Provider vorhanden ist. Das kann wahlweise Sqlite2, Sqlite3 oder PDO Sqlite sein. Die Versionen unterscheiden sich bei den Kommandos zum Öffnen der Datenbank oder beim Aufruf zum Ausführen eines Queries.

Bei Sqlite 3

$db = new SQLite3($sqliteDB);

Bei PDO Sqlite 3:

$db = new PDO("sqlite:".$sqliteDB);

Ich beziehe mich mal auf die PDO Variante…
So öffnet man eine DB und fügt mit Ausführung eines SQL Statements einen Eintrag hinzu. Eingefügt werden hier die aktuelle Uhrzeit (des Requests), Dateiname und dessen Erweiterung, IP-Adresse des Aufrufers, Referrer und User-Agent.

// $filename enthält den Dateinamen der heruntergeladenen Datei
$db = new PDO("sqlite:".$sqliteDB);
if ($db) {
  $path_info = pathinfo($filename);
  $ext=$path_info['extension'];

  $sql="INSERT INTO `downloadcount`
    (`time`, `file`, `ext`, `ip`, `referrer`, `useragent`)
    VALUES ('".date("Y-m-d H:i:s")."', '" . $filename . "', '".$ext."', '" . getenv("REMOTE_ADDR") . "',  '" . getenv('HTTP_REFERER') ."','".getenv('HTTP_USER_AGENT')."');
  ";

  // echo "SQL:<br>$sql<br>";
  $db->exec($sql);
}

Weiterführende Links: