Zu Hauptinhalt springen
Gewählte Sprache ist Deutsch Select language
Startseite UR

Autocache

Der Autocache-Mechanismus

Informationen sind im Internet sehr schnell veraltet. Web-Seiten auf dem aktuellsten Stand zu halten, ist mehr als schwierig. Eine Lösung des Problems bietet eine Datenbank, die von einem PHP-Skipt verwendet wird, um HTML-Seiten dynamisch zu generieren.

Solche Seiten können aber, besonders wenn die Datenbankabfragen aufwändig sind, relativ langsam sein. In Fällen, in denen die enthaltenen Informationen sich nicht sehr schnell änderen, kann es vorteilhaft sein, die Ergebnisse als statische HTML-Seiten zwischenzuspeichern.

Der Mechanismus


Der Auto-Cache-Mechanismus bietet eine sehr einfache Möglichkeit an: Das PHP-Skript enthält am Anfang und am Ende des Dokuments Funktionsaufrufe, die bewirken, dass ein reines HTML-Dokument erzeugt wird. Dieses Dokument wird dann abgespeichert und als Ergebnis zurückgeliefert. Alle Links sollen auf das HTML-Dokument verweisen, damit diese Version schnell ausgegeben werden kann.

Falls die Daten geändert werden, kann das PHP-Skript wieder gestartet werden (entweder direkt oder durch Löschung der HTML-Datei), um das HTML-Dokument zu aktualisiern. Bei der Erzeugung des HTML-Dokuments werden auch Informationen in eine weitere Datei (.auto_cache) geschrieben, so dass beim Fehlen der HTML-Datei das PHP-Skript automatisch aufgerufen wird. Jede Nacht läuft auf dem CGI-Server ein sog. Cron-Job, der einige dieser Auto-Cache-Dateien löscht. In diesem Fall wird der erste Zugriff am Tag das HTML-Dokument neu generieren. Alle weitere Zugriffe liefern dann die HTML-Datei zurück.

Voraussetzungen


Damit das PHP-Skript die notwendigen Dateien schreiben kann, muss der Server-Benutzer (www-httpd) Schreibrechte für das Verzeichnis haben, in dem die Dateien sich befinden. Dazu muss eine FACL gesetzt werden, am einfachsten durch das Kommando grantserver

Als Beispiel dient die Datei autocache.phtml, die diesen Text erzeugt hat. Sie benutzt den Auto-Cache-Mechanismus und liegt im Verzeichnis /www-cgi/htdocs/RZ/PHPlib/Dokumentation/. Um die Vorbereitungen zu treffen, muss man sich zuerst in den CIP-Login-Server rex2 einloggen und die FACL für das entsprechende Verzeichnis setzen.:

rex2:~> cd /www-cgi/htdocs/RZ/PHPlib/
rex2:/www-cgi/htdocs/RZ/PHPlib> /www/bin/cgi/grantserver Dokumentation/

rex2:/www-cgi/htdocs/RZ/PHPlib> getfacl Dokumentation/
# file: Dokumentation
# owner: rzd03380
# group: rz
user::rwx
user:787:rwx
user:788:rwx
user:789:rwx
group::r-x
mask::rwx
other::r-x
default:user::rwx
default:user:787:rw-
default:user:788:rwx
default:user:789:rw-
default:user:rzd03380:rwx
default:group::r-x
default:mask::rwx
default:other::r--

rex2:/www-cgi/htdocs/RZ/PHPlib>

Verwendungsbeispiel


Die wesentlichen Teile des Skripts /www-cgi/htdocs/RZ/PHPlib/Dokumentation/autocache.phtml sehen folgendermaßen aus:

<?php
require_once 'rz_doku_header.php3';
require_once 'rz_misc.php3';

$auto_cache = rz_misc_AutoCache(__FILE__ );

weitere PHP-Funktionen und Einstellungen

rz_html_header('Der Autocachemechanismus', 'Autocache Autocachemechanismus Cache',
'Eine Beschreibung des Autocachemechanismus', 'index, follow');
rz_doku_Kopf('Der Autocache-Mechanismus');


PHP-Anweisungen für das Dokument

?>
</body>
</html>
<?php rz_misc_AutoCacheE($auto_cache); ?>
Wichtiger Hinweis: Der Aufruf rz_misc_AutoCache(__FILE__) muss geschehen, bevor irgendwelche Texte ausgegeben werden und der Aufruf von rz_misc_AutoCacheE() muss ganz am Ende des Skripts (nach </html>) stehen. Ein häufiger Fehler ist es, einen Zwischenraum oder eine leere Zeile vor den <?php-Tag am Anfang des Dokuments zu setzen. Diese "white space"-Zeichen werden ausgegeben, woraus folgt, dass die Headers nicht mehr geändert werden können und die Funktion rz_misc_AutoCache() nicht mehr funktioniert.

Alle Links sollen auf die HTML-Datei verweisen. Wenn das Verzeichnis in die Liste der täglich zu löschenden Dateien aufgenommen werden soll, muss ein Antrag an den Webmaster gestellt werden.

Aktualisierung der HTML-Dateien


Auf allen Servern, auf denen der Autocachemechanismus läuft (www, www-cgi und www-rks), prüft die Fehler-404-Behandlung (Datei existiert nicht), ob die fehlende Datei im entprechenden .auto_cache aufgelistet ist, in welchem Fall das entsprechende PHP-Skript aufgerufen wird. Mit diesem Mechanismus gibt es drei Möglichkeiten, die HTML-Datei zu aktualisieren:

Neuer Aufruf


Wenn das PHP-Skript aufgerufen wird, wird die HTML-Datei auf jeden Fall neu erzeugt. Existierte die HTML-Datei vor diesem Aufruf nicht, so wird auf die HTML-Datei umgeleitet. Dies ist der Fall, wenn das Skript automatisch von der 404-Behandlung aufgerufen wird. Hier wurde die HTML-Datei verlangt. Es ist deshalb richtig, die HTML-Datei tatsächlich auszuliefern.

Wenn man aber etwas am PHP-Skript ändert, will man die neue Version sorfort austesten. Nehmen wir dieses Skript als Beispiel. Der URL der HTML-Datei ist
http://www-cgi.uni-regensburg.de/RZ/PHPlib/Dokumentation/autocache.html
Folgender Fall:
Dieses Document habe ich im Browser geöffnet und sehe einen Tippfehler. Ich ändere das PHP-Skript (autocache.phtml) und speichere die geänderte Version auf dem Server ab. In das Location-Feld des Browsers füge ich ein „p“ in den URL ein:
http://www-cgi.uni-regensburg.de/RZ/PHPlib/Dokumentation/autocache.phtml
Die HTML-Datei wird neu erzeugt und abgespeichert. Da sie aber schon vorher existierte, wird das richtige Ergebnis auf dem Bildschirm angezeigt; das Location-Feld bleibt aber unverändert, damit ich weitere Versuche machen kann. Wenn jemand anders die HTML-Datei zwischendurch abruft, bekommt er die aktuelle HTML-Version.

Bei Aufrufen mit GET_Parametern ist es nicht so einfach, den URL der HTML-Datei in den richtigen URL umzuwandeln, damit das Skript neu gestartet werden. In solchen Fällen ist es meist einfacher, die HTML-Datei durch das Kommando delautocache zu löschen und die original HTML-Datei erneut zu laden.

Das Kommando delautocache


Eine andere Möglichkeit wäre, die HTML-Datei zu löschen und diese Datei neu aufzrufen. Das kann aber gefährlich sein: Es ist allzu einfach die Datei autocache.phtml statt autocache.html zu löschen, womit alles einfach weg ist. Natürlich werden Backups täglich durchgeführt. Dateien können aber nur durch den Server-Administrator wieder hergestellt werden. Außerdem kann nur die Version der vorherigen Nacht restauriert werden.

Abhilfe schafft das Kommando
/www/bin/delautocache
das nur von rex2 aus verwendet werden kann. Als Parameter kann man eine Liste von Dateien und/oder Verzeichnissen angeben. Bei einem Verzeichnis wird zuerst kontrolliert, ob die Datei .auto_cache existiert. Ist das der Fall, so werden alle HTML-Dateien gelöscht, die in dieser Datei aufgelistet sind. Andernfalls wird nichts für das Verzeichnis unternommen. Bei einer Datei wird geprüft, ob die .auto_cache-Datei im Verzeichnis existiert und ob die angegebene Datei dort vorhanden ist. Es ist auch möglich, eine Steuerungsdatei anzugeben, die eine Liste der zu untersuchenden Dateien oder Verzeichnisse enthält.

Beispiel 1 – Löschen aller Autocache-Dateien eines Verzeichnisses


Im folgenden Beispiel enthält das Verzeichnis test/ zwei Skripten, die den Autocachemechanismus verwenden: index.phtml und testauto.phtml.

rex2:/www-cgi/htdocs/RZ/PHPlib/test> ls -al
drwxr-xr-x+ 3 rzd03380 wwwrio 512 Jul 13 16:07 .
drwxrwxr-x+ 10 rzd03380 wwwrio 1024 Jul 13 08:16 ..
-rw-rw-r--+ 1 788 www 86 Jul 13 16:03 .auto_cache
-rw-r--r-- 1 rzd03380 wwwrio 3300 Feb 22 18:59 head.php3
-rw-r--r--+ 1 788 www 6228 Jul 13 16:02 index.html
-rw-r--r-- 1 rzd03380 wwwrio 1271 Jun 23 18:44 index.phtml
drwxr-xr-x 2 rzd03380 www 512 Jul 11 18:19 misc
-rw-r--r-- 1 rzd03380 wwwrio 1761 Apr 19 13:49 testauto.phtml
rex2:/www-cgi/htdocs/RZ/PHPlib/test> /www/bin/delautocache .

Es wurden in 1 Verzeichnissen insgesamt 2 Dateien gefunden.
Hiervon wurden 1 gelöscht und 1 waren bereits gelöscht. (0 Fehler)
rex2:/www-cgi/htdocs/RZ/PHPlib/test>
Das Kommando
/www/bin/delautocache .
untersucht das aktuelle Verzeichnis und findet nur eine Datei zum Löschen.

Beispiel 2 – Löschen einzelner Autocache-Dateien


Im folgenden Beispiel enthält das Verzeichnis public_html/test2/ (eine private CGI-Homepage) zwei Skripten, die den Autocachemechanismus verwenden: index.phtml und test.phtml.

rex2:/www-cgi/home/mim09509/public_html/test2> ls -al
drwxr-xr-x+ 5 mim09509 rz 512 Jul 13 18:21 .
drwxr-xr-x 13 mim09509 rz 1024 Jul 12 16:11 ..
-rw-r--r--+ 1 788 www 77 Jul 13 18:21 .auto_cache
-rw-r--r--+ 1 788 www 3695 Jul 12 16:14 index.html
-rwxr--r-- 1 mim09509 rz 847 Jul 12 15:28 index.phtml
drwxr-xr-x+ 2 mim09509 rz 512 Jul 13 18:25 t
drwxr-xr-x+ 2 mim09509 rz 512 Jul 12 16:17 t2
-rw-r--r--+ 1 788 www 3736 Jul 13 18:21 test.html
-rwxr--r--+ 1 mim09509 rz 847 Jul 12 15:28 test.phtml
drwxr-xr-x 2 mim09509 rz 512 Jul 12 16:18 x
rex2:/www-cgi/home/mim09509/public_html/test2>
Das Unterverzeichnis t/ enthält ebenfalls zwei Skripten, die den Autocachemechanismus verwenden: index.phtml und t_test.phtml.

rex2:/www-cgi/home/mim09509/public_html/test2> ls -al t
drwxr-xr-x+ 2 mim09509 rz 512 Jul 13 18:25 .
drwxr-xr-x+ 5 mim09509 rz 512 Jul 13 18:21 ..
-rw-rw-r--+ 1 788 www 82 Jul 13 18:25 .auto_cache
-rw-rw-r--+ 1 788 www 3736 Jul 13 18:22 index.html
-rw-r--r--+ 1 mim09509 rz 847 Jul 12 15:54 index.phtml
-rw-rw-r--+ 1 788 www 3738 Jul 13 18:25 t_test.html
-rwxr--r--+ 1 mim09509 rz 849 Jul 13 18:24 t_test.phtml
rex2:/www-cgi/home/mim09509/public_html/test2>
Nur die Dateien index.html und t/t_test.html sollen gelöscht werden. Um die Wirkung zu kontrollieren, wird zusätzlich die Option -v (verbose) angegeben.

rex2:<4>test2> pwd
/www-cgi/home/mim09509/public_html/test2
rex2:<4>test2>/www/bin/delautocache index t/t_test.phtml -v
Bearbeite /www-cgi/home/mim09509/public_html/test2/index und zugehörige Dateien ...
index.html gelöscht
Bearbeite /www-cgi/home/mim09509/public_html/test2/t/t_test.phtml und zugehörige Dateien ...
t_test.html gelöscht

Es wurden in 0 Verzeichnissen insgesamt 2 Dateien gefunden.
Hiervon wurden 2 gelöscht und 0 waren bereits gelöscht. (0 Fehler)
rex2:<4>test2>
Obwohl index und t/t_test.phtml als Dateien angegen werden, wurden nur die entsprechenden HTML-Dateien index.html und t/t_test.html gelöscht. Das Protokoll bestätigt auch, dass kein Verzeichnis sondern nur zwei Dateien untersucht worden sind.

Syntax des Kommandos delautocache


Das Kommando
/www/bin/delautocache -optionen datei[en]/verzeichnis[se]/steuerungsdatei
löscht HTML-Dateien, die durch den Autocachemechanismus erzeugt worden sind. Die Optionen:

-q Quiet – nur Fehlermeldungen werden ausgegeben.
-v Verbose – alle gelöschten Dateien werden protokolliert.
-r Recursive – alle angegebene Verzeichnisse werden rekursiv untersucht.
-c Clean – alle gefundene .auto_cache-Dateien werden „bereinigt“ (s. cleanautocache).
-f File – statt einer Liste von Dateinen und/oder Verzeichnissen wird nur der Name einer Steuerungsdatei angegeben, die selbst die Liste der zu untersuchenden Dateinen/Verzeichnisse enthält.
Mindestens ein Parameter (datei[en]/verzeichnis[se]/steuerungsdatei) muss vorhanden sein. Wird die Option -f angegeben, so wird der erste Name in der Parameterliste als eine Steuerungsdatei interpretiert. Ist diese Option nicht vorhanden, so werden die Parameter als eine Liste von Dateien und/oder Verzeichnissen interpretiert.

Eine Steuerungsdatei enthält einen Eintrag pro Zeile. Ein Eintrag besteht aus einem Datei- oder Verzeichnisname und einem der folgenden optionalen Qualifikatoren:

r Recursive – das Verzeichnis wird rekursiv untersucht.
n No Recursion – das Verzeichnis wird nicht rekursiv untersucht.
i Ignore – Die Datei wird nicht gelöscht / das Verzeichnis wird nicht untersucht.
Für Qualifikatoren gilt:

  • Als Trenner zwischen Verzeichnis-/Dateiname und Qualifikator dürfen beliebig viele Zwischräume oder Tabs stehen.
  • Nur das erste Zeichen des Qualifikators wird berücksichtigt, wobei Groß-/Kleinschreibung unerheblich ist.
  • Qualifikatoren außer r, n oder i werden ignoriert.

Ist ein Qualifikator vorhanden, so wird eine evtl. angegebene -r-Option ignoriert. Ist kein Qualifikator vorhanden, so wird eine -r-Option in der Kommandozeile bei Verzeichnissen berücksichtigt.

Die Einträge werden in der gegebenen Reihenfolge abgearbeitet, wobei keine Datei und kein Verzeichnis mehrmals berücksichtigt wird.

Beispiel 3 – Steuerung durch eine Liste

>

Regelmäßige Löschung


Auf den Servern www.uni.regensbug.de, www-cgi.uni.regensbug.de und www-rks.uni.regensbug.de läuft jeder Nacht einen sog. Cronjob, der bestimmte Autocache-Dateien löscht:

/www/bin/delautocache -f acl.txt > acl.log
Um weitere Dateien und/oder Verzeichnisse in acl.txt (die Liste der täglich zu löschenden Dateien) eintragen zu lassen, reicht eine eMail an den Webmaster.

Weitere Anwendungsmöglichkeiten

Der Autocachemechanismus und RZ-Sessions

Skripten mit Parametern (GET, POST oder Path Info)


Es gibt vier Methoden, Informationen vom Browser an ein PHP-Skript zu übermitteln:

Cookies
Cookies werden vom Autocahemechanismus ignoriert. Es ist nicht sinnvoll sie in Zusammenhang mit diesem Mechanismus zu verwenden. Sie werden in den Autocahefunktionen ignoriert.
POST-Daten
POST-Daten können ebenfalls im Autocahemachanismus nicht berücksichtigt werden. Sind POST-Daten vorhanden, so wird kein HTML-Datei erzeugt.
Path-Info
Path-Info könnte beim Autocachemechanismus verwendet werden. Sie wird jedoch z.Zt. ignoriert. Nutzung von Path-Info ist zwar möglich, führt aber meistens zu unerwarteten Ergebnissen.
GET-Daten
GET-Variablen können unter bestimmte Bedingungen beim Autocahemachanismus berücksichtigt werden.
Beim Auruf von rz_misc_AutoCache() kann eine Liste GET-Variablen als Parameter angegeben werden. Ist dieser Parameter vorhanden, so werden alle angegebene GET-Variablen, die beim Aufruf des Skripts tatsächlich vorhanden sind, berücksichtigt und in den Namen der erzeugten HTML-Datei eingebaut. Als Beispiel der Aufruf
rz_misc_AutoCache(__FILE__, Array('x', 's'));
in einem Skript, das mit dem URL
http://www-cgi.uni-regensburg.de/RZ/PHPlib/test/misc/tm.phtml?s=TRUE&y=77&x=77
gestartet wird, erzeugt die HTML-Datei
tm_s-TRUE_x-77.html
Hier werden nur die GET-Variablen x und s berücksichtigt. Obwohl y angegeben wird, wird diese Variable im Namen der HTML-Datei ignoriert. Die genaue Regel für die zu berücksichtigenden GET-Parameternamen und deren Inhalte:

Die Liste der zu berücksichtigenden GET-Parameternamen muss als zweite Parameter zu rz_misc_AutoCache() angegeben werden.
Die Namen müssen mit einem Buchstaben beginnen und dürfen nur Buchstaben und Ziffern enthalten.
Die Werte der GET-Parameter, die durch HTTP übermittelt werden, sind grundsätzlich Strings. Diese Strings dürfen nur aus Buchstaben, Ziffern und das Minus-Zeichen bestehen.
Nur GET-Parameter, die diese drei Bedingungen erfüllen, werden im HTML-Dateinamen berücksichtigt. Die Dateiname hat die Form
<stamm>_<name>-<wert>.html
wobei <stamm> der Dateistamm (d.h. alles bis zum Punkt), <name> der Name einer GET-Variable und <wert> dessen Inhalt sind. Bei mehreren GET-Variablen wird _<name>-<wert> entsprechend wiederholt.

Pflege der Autocache-Dateien

Das Kommando cleanautocache

Das Kommando autocache.php

  1. Universität