das Caching des Frontends wurde hier schon ein paar mal angesprochen, es gibt auch von einigen Forenusern sehr gute Vorschläge zur Implementierung der Caching-Funktionalität.
Nun, am Besten ist die Steuerung des Caching-Verhaltens direkt bei Modulausgaben, da hier explizit festgelegt werden kann, ob die Ausgabe zum Cachen ist oder nicht. Diese Lösung bedarf aber einer Änderung der Contenido Sourcen, da unter anderem das Verhalten der Funktion "conGenerateCode" geändert werden muss, um dies zu realisieren.
Da ich so wenig Änderungen wie möglich an den Sourcen machen wollte, habe ich das Caching direkt in die "front_content.php" eingepflanzt. Verwendet wird hierbei das Caching von PEAR (genauer die Klasse Cache_Output). Das PEAR Caching bietet eine Funktionalität zum Speichern von dynamischen Ausgaben, also je nach Scriptverhalten.
Die Ausgabe wird als Datei auf dem Dateisystem abgelegt.
Das ganze kann unter http://www.purc.de/upload/contenido/concache0.8.zip heruntergeladen werden.
Neue Version mit Statistik Fix: concache0.9
Vorteile:
- Wenig Änderungen an den Sourcen (nur ein paar Zeilen in front_content.php)
- 50% - 70% Performancegewinn
- Bei Änderungen an Inhalten wird die Ausgabe neu gecached
- Caching ist abhänging von $REQUEST_URL, $_GET und $_POST Variablen, auch $auth möglich
Bekannte Nachteile:
- Es wird die komplette Ausgabe gecached. Ein Problem ist dabei z. B. ein Counter-Modul, da dieser die Seitenaufrufe zählt.
Wird die Seite gecached, gibt es keine korrekte Zählung. Hierbei wäre die Alternative, solche Module, z. B. in die "config.after.php" im Mandantenverzeichnis auszulagern, aber das sollte jeder für sich selber entscheiden.
- Keine explizite Cachingausnahme für bestimmte Artikel.
Configuration des Caching ('cms/includes/concache.php'):
Code: Alles auswählen
// flag zum ausschalten des caching, wenn das script von contenido aus aufgerufen wird, z. b. bei vorschau
$cfgConCache['excludecontenido'] = true;
// flag zum aktivieren des caching. bei true wird caching aktiviert, bei false ist es ausgeschaltet.
$cfgConCache['enable'] = true;
// flag zum erstellen von debug informationen.
$cfgConCache['debug'] = true;
// html template für debug information
$cfgConCache['infotemplate'] = '<div id="debug">%s</div>';
// flag zur ausgabe von weiteren cache informationen als html kommentar
$cfgConCache['htmlcomment'] = true;
// gültigkeit der caches in sekunden
$cfgConCache['lifetime'] = 3600;
// verzeichnis in die die cache-dateien abgelegt werden. wichtig: das script brauch hier schreibrechte.
$cfgConCache['cachedir'] = $cfgClient[$client]['path']['frontend'].'cache/';
// cache gruppe, ist ein unterordner von 'cachedir'
$cfgConCache['cachegroup'] = 'content';
// dateinamen prefix für erstellte cachedateien
$cfgConCache['cacheprefix'] = 'cache_';
// array mit verschienen variablen, von deren wert/inhalt das scriptverhalten abhängig ist.
// per default wird $REQUEST_URI, $_POST and $_GET verwendet, da diese Variablen im Großen und Ganzen die Modulausgaben beinflussen.
// es ist auch möglich, das $auth objekt hinzuzufügen, wenn z. B. die ausgabe von authentifizierten usern abhängig ist.
$cfgConCache['idoptions'] = array(
'uri' => &$REQUEST_URI,
'post' => &$_POST,
'get' => &$_GET
);
Zwischen folgenden Zeilen concache inkludieren, cache objekt und instanziieren.
Warum hier? Da wir die $idart und $idcat brauchen und diese vorher ermittelt werden
Code: Alles auswählen
...
$idartlang = getArtLang($idart, $lang);
if ($idartlang === false)
{
header($errsite);
}
// START: concache, murat purc
cInclude('frontend', 'includes/concache.php');
$oCacheHandler = new cConCacheHandler($GLOBALS['cfgConCache'], &$db);
$oCacheHandler->start($iStartTime); // $iStartTime ist optional und ist die startzeit des scriptes, z. b. am anfang von fron_content.php
// END: concache
/* If user hast contenido-
backend rights. */
if ($contenido)
{
...
Code: Alles auswählen
...
// START: concache, murat purc
$oCacheHandler->end();
echo $oCacheHandler->getInfo();
// END: concache
if (file_exists("config.after.php"))
{
@ include ("config.after.php");
}
...
Installation:
1. Zip herunterladen und entpacken
2. Inhalt von Ordner "Pear/Cache" in den Contenido-PEAR Ordner kopieren, also Contenidoinstallation/Pear
3. Inhalt von Ordner "cms/includes" in den Mandanten-Include Ordner kopieren (cms/includes/)
4. Zeilen in "front_content.php" einfügen.
Möchte noch anmerken, dass es sich hierbei um eine Erweiterung handelt, dessen Einsatz ich eher für erfahrene User empfehle. Außerdem sollte das noch nicht auf einem Produktivauftritt verwendetet werden, da es noch in der Entwicklungsphase ist.
Das Caching Wurde noch nicht unter verschiedenen Konstellationen (OS, PHP/MySQL-Version) getestet, sollte aber kein Problem sein.
Freue mich über Kritik und Anregungen von euch.
Grüße
xmurrix