[Support] Caching einer PHP-Anwendung

Christof Thalhofer chrisml at deganius.de
Sat Sep 2 16:17:00 CEST 2006


Hi Michael,

> 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.
...

> Welche Möglichkeiten habe ich? Wäre es möglich, das Caching für 
> mod_proxy wieder zu aktiveren? (Wir hatten es damals im Zusammenhang
> mit dem Leerzeichenproblem ausgeschaltet).

... 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.

> Das Problem: auch für "304 Not Modified"-Antworten muss PHP/CGI
> gestartet werden.
...

> Gibt es Alternativen?

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.

in .htaccess kannst Du schreiben:

    ErrorDocument 403 /create.php
    ErrorDocument 404 /create.php


In /create.php steht als Hauptfunktionalität:

<?

$req = $_SERVER["REQUEST_URI"];

//... diverser Code um daraus $pathfile zu machen
// $pathfile ist der komplette Pfad inklusive Dateinamen

//... diverser Code zur Erstellung der Webseite in der Variablen $cont
// $cont ist die HTML-Seite in einer Variable

    $file = fopen( $pathfile, "w");

//Speichern
    fputs( $file, $cont);
    fclose( $file);

//Anzeigen
    echo $cont;

?>

Zum Updaten einer Seite ist nur notwendig, nach Update der zugehörigen
Daten, sie (die Seite) zu löschen. Dann wird nur beim ersten User, der
die Seite sehen will, dynamisch generiert. Allen folgenden Besucher
werden statische Seiten geliefert, bis zum nächsten Update. Der
Performancegewinn ist enorm.

Nachteil dieser Methode ist nur, dass Du im Errorlog pro dynamischer
Generierung eine Logzeile bekommst.

Alles Gute

Christof


More information about the Support mailing list