[Support] Caching einer PHP-Anwendung - Loesungsmoeglichkeit

Michael Hierweck team at edv-serviceteam.net
Sun Sep 3 10:33:35 CEST 2006


Hallo Christof,

ich habe deinen Ansatz aufgegriffen, nachdem mir bereits ein ähnlicher
Ansatz im Kopf herum spukte.

Christof Thalhofer wrote:

>> eine PHP-Anwendung generiert HTML-Code und zahlreiche Grafiken
>> dynamisch.
>>
>> Zumindest die Grafiken würde ich gern einige Zeit cachen, um die 
>> Performance zu erhöhen und den Hive zu entlasten. Es könnten damit
>> rund 80% der PHP-Starts eingespart werden.
> ...
> 
> ... Ich halte einen Cache via Apache mod_proxy (besser wäre Squid) nicht
> für ganz optimal. Denn nach einer gewissen Zeit mußt Du die Grafiken
> wieder generieren, ob nun notwendig (weil geändert) oder nicht. Und wenn
> sich die grundlegenden Daten geändert haben, zeigen die Grafiken aber
> noch eine ganze Weile die veraltete Version, für den von Dir definierten
> Zeitraum, bis der Cache sie neu einliest.

Unser Problem ist, dass nur PHP "wissen" kann, ob wann die Grafiken
nicht mehr "da" sein dürfen. Das würde für einen Cache auf PHP-Basis
sprechen, andererseits musste ich unbedingt die unzähligen PHP-Starts
verhindern.

Der Kompromiss sieht folgendermaßen aus:

Die HTML-Seiten werden nicht gecacht. Damit haben wir einen PHP-Start
pro Seite. Das ist für die Performance OK, jedenfalls viel besser als 10
bis 500 Starts ;-)

Damit werden zwischenzeitlich "ungültige" Grafiken in Echtzeit zumindest
nicht mehr verlinkt und sind für Otto-Normal-Surfer "weg".

Zum Caching der Grafiken selbst:

Immer dann, wenn PHP eine Grafik generieren muss, legt PHP nun eine
Kopie derselben unter ../subs/www/cache/ ab.

Per .htaccess prüfe ich nun, ob ich PHP starten muss oder die Grafik aus
dem Cache bedienen kann:

RewriteCond /home/doms/example.com/subs/www/cache/%{REQUEST_URI} -f
RewriteCond %{REQUEST_URI} !^/cache/
RewriteRule ^(.*) /cache/$1 [L]

Nun ist es eine Abwägung zwischen Performance und Sicherheit, wie oft
ich den Cache per Cronjob prüfen lasse und veraltete Grafiken hinaus
werfe. Hier werden alle Cacheinhalte verworfen, die zum Zeitpunkt der
Prüfung älter sind als 60 Minuten:

nice -15 find /home/doms/example.com/subs/www/cache/ -type f -cmin +60
-exec rm {} \;

In unserem Fall ist es aufgrund der Konstellation glücklicherweise so,
dass die Wahrscheinlichkeit, dass ein Besucher zu einem Zeitpunkt sehr
viele Grafiken neu erzeugen lassen muss sehr gering ist,
wahrscheinlicher ist, dass alle oder fast alle Grafiken bereits im Cache
liegen.

> 
> Ein Trick, den wir nutzen (für HTML-Seiten, aber warum soll das nicht
> auch für Grafiken gehen):
> 
> Das Error-Dokument ist ein PHP-Skript, der die Seiten dynamisch
> erstellt, in eine Variable schreibt und als Dateien auf Platte speichert.

Diese Möglichkeit orientiert sich damit an deinem Vorschlag, verzichtet
aber auf den Hack mit demm Error Document und seinen Nebenwirkungen.

Verbesserungsvorschläge nehme ich gern entgegen. Entsprechendes gilt
natürlich auch für Nachfragen zu Details bei Interesse.

Vielen Dank an alle.

Viele Grüße

Michael

-- 
Michael Hierweck
EDV-Serviceteam Werthmann & Hierweck GbR
http://www.edv-serviceteam.net


More information about the Support mailing list