Artikel - Detailansicht

Icon Aktuelles Pagecaching mit <cfsavecontent> 2

Das Script aus Teil 1 hat, wenn man es so direkt in der Praxis einsetzt, einen kleinen Schönheitsfehler. Ist die Applicationvariable einmal gefüllt und der gewünschte Abschnitt gecached, wirken sich weitere Änderungen am HTML- und Programmcode nicht mehr aus. Das bedeutet, geänderter HTML-Code wird nicht sichtbar und es erscheint weiterhin der alte HTML-Code, der nun nirgendwo mehr in einer CF-Datei steht. Auch der neue Programmcode wird nicht ausgeführt; stattdessen wird das Ergebniss des alten Programmcodes sichtbar.

Nun mag es sicherlich eine gewisse Freude bereiten, einem Webdesigner beim Verzweifeln zuzusehen, weil er für ihn unverständlicherweise seinen neuen HTML-Code nicht in der Seite findet. Auf die Dauer wird das aber langweilig und der Designer merkt es eh irgendwann. Also benötigen wir eine Möglichkeit, den Cache irgendwie zu löschen.

Das ist einfach zu lösen, denn wir müssen nur die Variable Application.pageCache killen, so daß die Abfrage:

<cfif NOT IsDefined("Application.pageCache")>

wieder true ergibt.Das Löschen erledigen wir wie folgt:

<cfset structDelete(Application,"pageCache")>

Da Application eine Struktur ist, können wir die Variable Application.pageCache löschen, indem der Key pageCache in der Struktur Application entfernt wird (locken nicht vergessen).

Das nächste Problem ist, wann und wo wir die Variable löschen:
Eine einfache Lösung besteht darin, den Lösch-Code in einer speziellen cfm-Page unterzubringen (z.b. init.cfm) und diese Page innerhalb der Application abzulegen. Ruft man jetzt die init.cfm im Browser auf, wird Application.pageCache gelöscht und beim nächsten Aufruf der Contentseite sind die aktuellen Daten sichtbar.

Etwas bequemer hat man es, wenn man die folgende Variante benutzt:
Die Steuerung des Löschens erfolgt hier über eine URL-Variable (z.B. URL.init). Im Application.cfm fragen wir die Existenz der Variable ab und löschen dann beim Vorhandensein den Cache:

<cfif isDefined("URL.init")>
 <cflock scope="Application" type="Exclusive" timeout=10>
  <cfset structDelete(Application,"pageCache")>
 </cflock>
</cfif>

So können wir jede Seite in der Applikation aufrufen und damit den Cache zurücksetzen.

Die nächste Optimierung betrift die Struktur unseres Caches:
Setzen wir dieses Cachen vertstärkt ein, haben wir bald viele Variablen in der Form: Application.pageCache1, Application.pageCache2, Application.pageCache3 usw. Zur Inizialisierung müssten wir auch alle diese Variablen wieder löschen. Viel zuviel Tipparbeit für einen Programmierer. Deshalb ändern wir unsere Cachevariable in der Form, daß wir eine weitere Strukturebene hinzufügen, die alle Cachevariablen als Childelemnte aufnehmen soll:

Das Löschen des Caches sowie die Inizilisierung sieht dann in der Aplication.cfm so aus:
<cfif isDefined("URL.init")>
 <cflock scope="Application" type="Exclusive" timeout=10>
  <cfset structDelete(Application,"strPageCache")>
  gelöscht!<br>
 </cflock>
</cfif>

<cfparam name="Application.strPageCache" type="struct" default="#StructNew()#">

So ist sichergestellt, daß die Struktur Application.strPageCache immer existiert.

In den jeweiligen Seiten muss der Code dann wie folgt aufgebaut sein, beispielsweise, um die Homepage zu cachen:

<cfif NOT IsDefined("Application.strPageCache.ContentHome")>

 <!--- hier muss mit <cfsavecontent... die Variable mContent gefüllt werden --->

 <cflock scope="Application" type="Exclusive" timeout=10>
  <cfset Application.strPageCache.ContentHome = mContent>  </cflock> </cfif>

in einer anderen Page, beispielsweise der Produkliste:

<cfif NOT IsDefined("Application.strPageCache.ContentProcucts")>
 <!--- hier muss mit <cfsavecontent... die Variable mContent gefüllt werden --->
 <cflock scope="Application" type="Exclusive" timeout=10>
  <cfset Application.strPageCache.ContentProcucts = mContent>
 </cflock>
</cfif>

Jetzt können in beliebigen neuen Seiten der Cachecode eingefügt werden, ohne das der Inizialisierungscode in der Application.cfm angepasst werden muss.

Steffen Goldfuß steffen@goldfuss.de - 16.05.2003

Zurück


Das deutsche ColdFusion-Forum cfml.de ist das Portal für Einsteiger und Experten zum Thema ColdFusion und der ColdFusion Markup Language (CFML).

© 2017 Webdesign & Hosting: CHC ONLINE Kassel | SOLVA Content-Management-System CMS
Urlaub-Angebote.de - Urlaub mit Bestpreis-Garantie buchen