- 2011
- Mär
- 6
PHP-Schnipsel: Hintergrundjobs durch Seitenaufrufe auslösen lassen
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)
- 2010
- Okt
- 29
PHP mit Sqlite - mein erster Gehversuch
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:
- Axels Webseite: Download-Zähler
- Sqlite Administrator (Freeware; Windows)
- www.php.net - PDO Sqlite
- www.php.net - Sqlite 3
- in Programmierung, PHP