Thomas Darimont
Erfahrenes Mitglied
Hallo,
ich würde für meine Website gerne einen kleinen Cachingmechanismus bauen. Ich habe nicht allzu viel Ahnung von PHP
und will bevor ich mich da weiter einarbeite erstmal fragen ob mein Vorhaben überhaupt so machbar ist.
Ich habe viele kleine php Scripts die jeweils nur eine "Box" in meinem Layout generieren.
Diese sehen dann immer so aus:
(page.php)
Da sich der Inhalt einiger Boxen relativ selten ändert würde ich diese gerne cachen und nur nach Ablauf einer gewissen Zeit
neugenerieren.
Das könnte man zum einen über eine generische caching Lösung geschehen die sich beispielsweise in dieser Form im Code widerspiegelt:
caching.php?cache=page.php -> page.php -> page.static.html
Es gibt eine caching.php welche Beispielsweise über einen Parameter in der URL die zu cachende Datei übergeben bekommt.
Beim ersten Aufruf dieser URL wird dann das page.php Script ausgeführt, die Ausgabe wird zwischengespeichert und in eine Datei
weitergeleitet -> page.static.html. Anschließend wird die zwischengespeicherte Ausgabe zum Aufrufer gesendet. Beim der nächsten
Anfrage für page.php die innerhalb eines bestimmten (Konfigurierbaren) Zeitlimits geschieht wird einfach der Inhalt aus
page.static.html zurück geliefert. Erfolgt ein Aufruf nachdem das Zeitlimit abgelaufen ist so wird die page.static.php wieder
erneut generiert.
So würde ich das eigentlich machen, leider macht mir die verwendete Drittsoftware hier einen Strich durch die Rechnung -
als Inhalt für eine "Box" in meinem template kann ich leider nur Dateien angeben und keine URLs... also fällt die generische Lösung
via: caching.php?cache=page.php weg. Weiterhin möchte ich keine der ursprünglichen Dateien (page.php) modifizieren müssen
( außer den "Aufrufern / includiern");
Alternative:
Zu jeder page.php gibts eine page.cached.php
configuration.php:
Diese macht dann (in pseudo code) ungefähr sowas
den vorgenerierten Code kann man dann im Filesystem oder auch im Speicher (Server Variable) ablegen und über entsprechende
Strategien (Strategy Pattern) konfigurierbar machen.
Weis jemand ob man das so mit PHP umsetzen kann, gibts vielleicht Verbesserungsmöglichkeiten? Gibts vielleicht noch
kostenlose open source produkte die all das schon können und einfach einzubauen und zu konfigurieren sind?
Kann man sich vielleicht zentral in den include Mechanismus einklinken um dann deklaratives caching möglich zu machen?
Wenn das möglich wäre könnte man wunderbar sowas definieren:
CacheConfiguration.php
Alle Anfragen an zu cachende Ressourcen gehen dann durch eine generalisierte Version des oben gezeigten Codes.
Geht sowas?
Gruß Tom
ich würde für meine Website gerne einen kleinen Cachingmechanismus bauen. Ich habe nicht allzu viel Ahnung von PHP
und will bevor ich mich da weiter einarbeite erstmal fragen ob mein Vorhaben überhaupt so machbar ist.
Ich habe viele kleine php Scripts die jeweils nur eine "Box" in meinem Layout generieren.
Diese sehen dann immer so aus:
(page.php)
Code:
< ? php
code ...
? >
neugenerieren.
Das könnte man zum einen über eine generische caching Lösung geschehen die sich beispielsweise in dieser Form im Code widerspiegelt:
caching.php?cache=page.php -> page.php -> page.static.html
Es gibt eine caching.php welche Beispielsweise über einen Parameter in der URL die zu cachende Datei übergeben bekommt.
Beim ersten Aufruf dieser URL wird dann das page.php Script ausgeführt, die Ausgabe wird zwischengespeichert und in eine Datei
weitergeleitet -> page.static.html. Anschließend wird die zwischengespeicherte Ausgabe zum Aufrufer gesendet. Beim der nächsten
Anfrage für page.php die innerhalb eines bestimmten (Konfigurierbaren) Zeitlimits geschieht wird einfach der Inhalt aus
page.static.html zurück geliefert. Erfolgt ein Aufruf nachdem das Zeitlimit abgelaufen ist so wird die page.static.php wieder
erneut generiert.
So würde ich das eigentlich machen, leider macht mir die verwendete Drittsoftware hier einen Strich durch die Rechnung -
als Inhalt für eine "Box" in meinem template kann ich leider nur Dateien angeben und keine URLs... also fällt die generische Lösung
via: caching.php?cache=page.php weg. Weiterhin möchte ich keine der ursprünglichen Dateien (page.php) modifizieren müssen
( außer den "Aufrufern / includiern");
Alternative:
Zu jeder page.php gibts eine page.cached.php
configuration.php:
Code:
cacheInvalidationInterval=1000 * 60 * 5; //5 min
Diese macht dann (in pseudo code) ungefähr sowas
Code:
< ? php (page-cached.php)
cacheInvalidationInterval = configuration['cacheInvalidationInterval'];
file = "page.php";
cachedFile = '"page.static.html";
if( !exists(cachedFile ) || (currentTime - lastModified(cachedFile ) ) > cacheInvalidationInterval ){
pregeneratedOutput= include(file ); //output buffering
store(pregeneratedOutput, cachedFile );
}else {
pregeneratedOutput= retrieve(cachedFile );
}
output(pregeneratedOutput); //echo ...
? >
den vorgenerierten Code kann man dann im Filesystem oder auch im Speicher (Server Variable) ablegen und über entsprechende
Strategien (Strategy Pattern) konfigurierbar machen.
Weis jemand ob man das so mit PHP umsetzen kann, gibts vielleicht Verbesserungsmöglichkeiten? Gibts vielleicht noch
kostenlose open source produkte die all das schon können und einfach einzubauen und zu konfigurieren sind?
Kann man sich vielleicht zentral in den include Mechanismus einklinken um dann deklaratives caching möglich zu machen?
Wenn das möglich wäre könnte man wunderbar sowas definieren:
CacheConfiguration.php
Code:
cacheConfiguration = new CacheConfiguration();
memoryCachingStrategy = new MemoryCachingStrategy();
fileSystemCachingStrategy = new FileSystemCachingStrategy();
cacheConfiguration.cache("bubu.php",5*1000*60,memoryCachingStrategy);
cacheConfiguration.cache("gugu.php",10*1000*60,memoryCachingStrategy);
cacheConfiguration.cache("foo.php",30*1000*60,fileSystemCachingStrategy );
Cache cache = new Cache(cacheConfiguration);
cache.registerIncludeHook();
...
Alle Anfragen an zu cachende Ressourcen gehen dann durch eine generalisierte Version des oben gezeigten Codes.
Geht sowas?
Gruß Tom