Artikel - Detailansicht

Icon Aktuelles Pagecaching mit <cfsavecontent> 1

Ein grosses Problem dynamischer Seite im Web ist oft immer noch die Geschwindigkeit des Seitenaufbaus. Umfangreiche SQL-Abfragen oder Zugriff auf externe Daten führen oft zu einem langsamen Seitenaufbau bzw. schlechter Reaktionszeit des Servers. Bereits im Artikel Shop-Strategien: dynamisch generierte, statische Dokumente wurde eine Lösung der Performancesteigerung aufgezeigt.

Eine andere Möglichkeit besteht in der Anwendung des <cfsavecontent>-Tags, welches es nun schon seit der Version 5 gibt. Das <cfsavecontent>-Tag speichert die HTML-Ausgabe des CF-Codes zwischen dem Start- und End-Tag inklusive der Ausgaben von Customtags oder CFCs.
Dieses Feature wollen wir im folgenden benutzen um den Seitenaufbau zu beschleunigen. Sehen wir uns zuerst eine einfache Beispiel-Seite an (die in der Realität nun wahrscheinlich nicht wirklich ein Problem für einen Server darstellen sollte):

<cfquery name="qData" datasource="foo">
 select a, lot , of , shit from table
</cfquery>


<table>
<cfoutput query="qData">
 <cfset variables.farbe=IIf(qData.CurrentRow mod 2, DE("eeeeee"), DE("ffffff"))>
 <cfset variables.foo=exp(qData.a)*sin(qData.a)>
 <tr bgcolor="#variables.farbe#">
  <td>#qData.CurrentRow#.</td>
  <td>#variables.foo#</td>
  <td>#qData.lot#</td>
  <td>#qData.of#</td>
  <td>#qData.shit#</td>
 </tr>
</cfoutput>
</table>

Wir führen eine Datenbankabfrage (qData) aus und liefern das Ergebnis als HTML-Tabelle. Jeder Aufruf der Seite verursacht eine Datenbankabfrage: die Berechnung im Ausgabeloop und die Ausgabe des HTML-Codes.

Um die Ausführungsgeschwindigkeit der Page zu beschleunigen können wir jetzt mit <cfsavecontent> schreiben:

<cfif NOT IsDefined("Application.pageCache")>
 <cfsavecontent variable="mContent">

<!--- der normale Code ------------------------------->
<cfquery name="qData" datasource="foo">
 select a, lot , of , fun from table
</cfquery>

<table>
 <cfoutput query="qData">
  <cfset variables.farbe=IIf(qData.CurrentRow mod 2, DE("eeeeee"), DE("ffffff"))>
  <cfset variables.foo=exp(qData.a)>
  <tr bgcolor="#variables.farbe#">
   <td>#qData.CurrentRow#.</td>
   <td>#variables.foo#</td>
   <td>#qData.lot#</td>
   <td>#qData.of#</td>
   <td>#qData.fun#</td>
  </tr>
 </cfoutput>
</table>
<!--- der normale Code ------------------------------->
</cfsavecontent>

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

<!--- jetzt Ausgabe des HTML-Codes --->
<cfoutput>#Application.pageCache#</cfoutput>

Werfen wir einen detailierten Blick auf den neuen Code:
Das Prinzip unserer Performanceoptimierung besteht darin, daß ein Stück performancelastiger Programmcode nur einmal ausgeführt und das Ergebnis in einer Application-Variable gespeichert wird. Dieser so generierte HTML-Content wird immer dann in der Page ausgegeben, wenn der Code ausgeführt werden muss. Natürlich können wir auf diese Weise nur Code optimieren, der lediglich Ausgaben erzeugt und keinerlei Datenmanipulationen durchführt. In der Variable Application.pageCache wollen wir zukünftige den HTML-Content speichern. Deshalb müssen wir zuerst prüfen, ob die Variable vorhanden ist:

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

Ist sie das nicht, ist das unser Zeichen, daß der Programmcode ausgeführt, und das Ergebnis gesichert werden muss. Dazu umschliessen wir den Code mit einem <cfsavecontent>-Tagpaar und speichern das Ergebniss der Programmausführung in der Variable mContent. Jetzt müssen wir das resultierende HTML-Stück noch dauerhaft (persistent:-) ) speichernund das erfolgt mit diesem Codestück:

<cflock scope="Application" type="Exclusive" timeout=10>
 <cfset Application.pageCache = mContent>
</cflock>

Wenn wir jetzt die HTML-Tabelle mit den Ergebnissen aus der SQL-Abfrage in einer Seite ausgeben wollen, müssen wir lediglich die Variable Application.pageCache ausgeben:

<cfoutput>#Application.pageCache#</cfoutput>

Natürlich kann man den Code auch optimieren, indem man dem <cfquery> ein cachedwithin mitgibt. Der Trick mit dem <cfsavecontent> optimiert allerdings auch den Code zur Erstellung der HTML-Tabelle und jeden anderen Anzeige-Code gleich mit.

Steffen Goldfuß steffen@goldfuss.de - 24.04.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