contenido simple cache engine

Fragen zur Installation von CONTENIDO 4.9? Probleme bei der Konfiguration? Hinweise oder Fragen zur Entwicklung des Systemes oder zur Sicherheit?
emergence
Beiträge: 10653
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

contenido simple cache engine

Beitrag von emergence »

mit dieser änderung ist es möglich gewisse teile des modul codes oder des layout nochmals zu evaluieren... als bonus sind cms_type platzhalter in schleifen möglich... (CMS_VAR und CMS_VALUE zählen nicht dazu...)

anstelle dessen das man

Code: Alles auswählen

<?php echo "was auch immer"; ?>
einsetzt, verwendet man

Code: Alles auswählen

<!cache echo "was auch immer"; cache!>
der unterschied liegt nun darin wie nun der code in der con_code gespeichert wird...

normaler php code wird as is in der con code gesichert... also

Code: Alles auswählen

<?php echo "was auch immer"; ?>
gecachter code speichert nur die ausgabe des echo befehls...

Code: Alles auswählen

was auch immer
das ganze wurde so implementiert das auch innerhalb von dieser gecachten code passagen CMS_VALUE verwendet werden kann...

die grundsätzliche vorgangsweise wie code nun in der con_code erzeugt wird sieht jetzt wie folgt aus

1. innerhalb der konfigurierten module wird zu allererst CMS_VALUE durch den konfigurationswert ersetzt...
2. anschließend werden die module in dem entsprechenden layout eingebettet
3. (neu) gefundene <!cache cache!> passagen innerhalb des gesamten bisherigen erzeugen codes werden evaluiert
4. anschließend werden die cms_type platzhalter ersetzt
5. code wird in der con_code hinterlegt
6. gesamter code wird in der front_content bei aufruf evaluiert

<!cache cache!> funktioniert sowohl im layout als auch in modulen...
eine kombination aus beiden also normaler php code und gecachten code ist ebenso möglich...

damit ein großteil der bisherigen module ebenso als gecachte version lauffähig sind wird ein grundstock an contenido variablen zur verfügung gestellt....

welche da wären:
$idcat, $idart, $idcatart, $idartlang, $lang, $client, $cfg, $cfgClient, $edit, $sess, $perm, $auth, $encoding und eine eigene $db instanz...

die als gecachte version ausgeführten module können ebenso eine variable $cache abfragen, welche auf true gesetzt ist...

gewisse kleinigkeiten bei dieser arbeitsweise mit dem code werden nicht (ohne weiteres) funktionieren... zb auswertung von $_GET,$_POST,$_REQUEST werten...
*** make your own tools (wishlist :: thx)
phpchris
Beiträge: 438
Registriert: Fr 28. Mai 2004, 16:07
Kontaktdaten:

Beitrag von phpchris »

Hmmm...

Verstehe den Geschwindigkeitsvorteil noch nicht wirklich bei dieser Art Caching...
emergence
Beiträge: 10653
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence »

die änderungen (ich beziehe das jetzt mal alles auf contenido-cvs-2005-09-02.tar)

cms/front_content.php
nach

Code: Alles auswählen

	unset($edit); // disable editmode
folgendes ergänzen...

Code: Alles auswählen

	unset($cache); // disable cachemode
weiters
functions.mod.php
bei function modTestModule
nach

Code: Alles auswählen

    $code = str_replace('CMS_VALUE','$CMS_VALUE', $code);
    $code = str_replace('CMS_VAR','$CMS_VAR', $code);
folgende zeile ergänzen

Code: Alles auswählen

    $code = str_ireplace(Array('<!cache','cache!>'),Array('<'.'?php','?'.'>'), $code);
functions.con2.php
neue funktion

Code: Alles auswählen

/**
 * Generates the code for cached elements
 *
 * @param int $idcat Id of category
 * @param int $idart Id of article
 * @param int $idcatart Id of categoryarticle
 * @param int $idartlang Id of articlelang
 * @param int $lang Id of language
 * @param int $client Id of client
 * @param int $output code fragment which may include <!cache cache!> elements
 *
 * @author Martin Horwath <horwath@dayside.net>
 * @copyright dayside.net <www.dayside.net>
 */
function conGenerateCacheCode ($idcat, $idart, $idcatart, $idartlang, $lang, $client, &$output) {

    // cache prototyp engine
    if (strpos ($output, "<!cache") !== false && strpos ($output, "cache!>") !== false) {

        // very simple ... very fast
        $output = stripslashes($output);

        $output = str_replace (Array("<"."?","?".">"), Array("<!?","?!>"), $output);
        $output = str_ireplace (Array("<!cache","cache!>"), Array("<"."?php","?".">"), $output);

        global $cfg, $cfgClient, $edit, $sess, $perm, $auth, $encoding;
        $db = new DB_Contenido();

        $cache = true;

        ob_start();
        eval("?>\n".$output."\n<?php\n");
        $output = ob_get_contents();
        ob_end_clean();

        $output = str_replace (Array("<!?","?!>"), Array("<"."?","?".">"), $output);

        $output = addslashes($output);

    }

}
ad.

Code: Alles auswählen

 if (strpos ($output, "<!cache") !== false && strpos ($output, "cache!>") !== false) {
erkennt noch nicht gross und kleinschreibung

selbe datei
function conGenerateCode
nach

Code: Alles auswählen

                    /* Replace new containers */
                    $code = preg_replace("/<container( +)id=\\\\\"$value\\\\\"(.*)>(.*)<\/container>/i", "CMS_CONTAINER[$value]", $code);
                    
                    $code = preg_replace("/<container( +)id=\\\\\"$value\\\\\"(.*)\/>/i", "CMS_CONTAINER[$value]", $code);
                    
                    $code = str_ireplace("CMS_CONTAINER[$value]", "<?php $CiCMS_VALUE ?>\r\n".$output, $code);  

                    $fedebug = "";

                }
(und zwar genau nach der klammer) folgendes ergänzen

Code: Alles auswählen

                conGenerateCacheCode ($idcat, $idart, $idcatart, $idartlang, $lang, $client, $code);
include.con_editcontent.php
nach

Code: Alles auswählen

                    /* Long syntax with closing tag */
                    $code = preg_replace("/<container( +)id=\\\\\"$value\\\\\"(.*)>(.*)<\/container>/i", "CMS_CONTAINER[$value]", $code);
                    
                    /* Short syntax */
                    $code = preg_replace("/<container( +)id=\\\\\"$value\\\\\"(.*)\/>/i", "CMS_CONTAINER[$value]", $code);
                    
                    $code = str_ireplace("CMS_CONTAINER[$value]", "<?php $CiCMS_VALUE ?>\r\n".$output, $code);
                    
                    
                        
                }
(und wieder genau nach der klammer) folgendes ergänzen

Code: Alles auswählen

                conGenerateCacheCode ($idcat, $idart, $idcatart, $idartlang, $lang, $client, $code);
das wars...
*** make your own tools (wishlist :: thx)
emergence
Beiträge: 10653
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence »

phpchris hat geschrieben:Verstehe den Geschwindigkeitsvorteil noch nicht wirklich bei dieser Art Caching...
code der nicht mehr evaluiert werden muss und nur zb als text ausgegeben wird, ist logischer weise schneller... bei einfachen modulen wirst du nicht sonderlich viel merken...

ich geb dir mal ein kleines beispiel anhand des snippets moduls -> http://contenido.org/forum/viewtopic.php?p=16162#16162

da würde das ganze so aussehen

Code: Alles auswählen

<!cache 
/** 
 * Snippets v0.0.4 
 * 
 * OUTPUT 
 * 
 * @autor Martin Horwath <horwath@dayside.net> 
 * @copyright dayside.net 2003,2005 
 */ 

 // configuration 
 $cfg["tab"]["snippets"] = $cfg['sql']['sqlprefix']."_snippets"; // for syntax reasons only 

 if($db->query("SELECT * FROM ".$cfg["tab"]["snippets"]." WHERE idclient =".$client." AND idlang = ".$lang." AND idsnippet = 'CMS_VALUE[1]'")) { 

   $db->next_record(); 

   $idsnippet = $db->f("idsnippet"); 
   $name = $db->f("name"); 
   $code = stripslashes($db->f("code")); 
   $author = $db->f("author"); 
   $lastmodified = $db->f("lastmodified"); 

   if ("" != "CMS_VALUE[1]") { // only show if value is set 
     echo "\n<!-- *snippet: start* id: $idsnippet | name: $name | author: $author | lastmodified: $lastmodified //-->\n"; 
     if ($cache) {
       echo $code;
     } else {
       eval(" ?".">".$code."<"."?php ");
     } 
     echo "\n<!-- *snippet: end* id: $idsnippet | name: $name //-->\n"; 
   } 

 } else { 
   echo "<!-- *snippet: error | check article configuration | set value: 'CMS_VALUE[1]' //-->"; 
 } 
cache!>
bisher wurde immer der gesamte code gespeichert
nun nur mehr das was via echo ausgegeben wird...

was spart man nun an zeitaufwendung eine db abfrage und ein eval...
*** make your own tools (wishlist :: thx)
phpchris
Beiträge: 438
Registriert: Fr 28. Mai 2004, 16:07
Kontaktdaten:

Beitrag von phpchris »

Jetzt hats geklingelt, nicht schlecht!
stese
Beiträge: 1040
Registriert: Fr 3. Dez 2004, 17:47
Wohnort: München
Kontaktdaten:

Beitrag von stese »

kurze frage: was ich jetzt nicht so geblickt habe ist, wie er erkennt ob sich z.b. innerhalb eines modules jetzt was geändert hat. bzw wie er erkennt wenn jetzt mein modul z.b. ne db ausgabe hat und der wert der db sich nun geändert hat, wie er damit verfährt.

ansich ist es eine schöne idee, die sicher ein paar querys sparen wird.
emergence
Beiträge: 10653
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence »

es gibt keine erkennung ob sich ein db abfrageergebniss geändert hat...

eine änderung im modul, layout code , template konfiguration, content änderung sorgt dafür das der eintrag in der con_code erneuert wird...
*** make your own tools (wishlist :: thx)
stese
Beiträge: 1040
Registriert: Fr 3. Dez 2004, 17:47
Wohnort: München
Kontaktdaten:

Beitrag von stese »

ok danke, also sollte man eher keine teile damit cachen, die dynamischen db daten beinhalten.

danke trotzdem für den snippet - ist vielversprechend
emergence
Beiträge: 10653
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence »

stese hat geschrieben:also sollte man eher keine teile damit cachen, die dynamischen db daten beinhalten.
nun schlussendlich muss/kann/darf das der entwickler entscheiden...
*** make your own tools (wishlist :: thx)
SkyBlader
Beiträge: 303
Registriert: Do 18. Mär 2004, 16:23
Wohnort: Ratingen / NRW
Kontaktdaten:

Beitrag von SkyBlader »

naja, angenommen man benutzt das bei einem nav modul ...

den effekt versuch ich mir lieber nicht vorzustellen.

aber für kleinere / statischere dinge sicherlich hilfreich.

Eine Frage emerg:

da man ja cache und non-cache code innerhalb eines modules mixen kann, wenn ich dich richtig verstanden habe, wärs dann evtl möglich ne funktion / flag im non-cached code zu setzen, mit dem das cachen modul-intern gesteuert werden kann ? ( könnt mir da ggf. ne eigen verwaltung vorstellen )

aber mußt jetzt nicht extra weiter coden, war nur so ne frage ;)

so long

stefan
Contenido 4.4.4/4.4.5 - Contenido 4.5.x

Module:sn_multinav für 4.5.x
emergence
Beiträge: 10653
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence »

ähm es bei nav modul zu verwenden würd ich nicht wirklich raten...

einen schalter wann gecachter code zu erzeugen ist, gibts in dem sinne nicht... ein flag dafür zu setzen bringts eigentlich auch nicht wirklich...
das ganze ist direkt mit der con_code gekoppelt...


<!cache cache!> passagen werden vor jedem anderen php code ausgeführt...
eine kombination gecached und nicht gecached ist möglich... zb um php code zu erzeugen... (man muss halt auf die steuerzeichen aufpassen...)

man kann das für alles mögliche nutzen...

folgender code

Code: Alles auswählen

<?php 
echo date('l, d. F Y');
?>
<!cache 

for ($i = 1; $i < 10; $i++) { 
    echo "<".'?php echo "CMS_HTML['.$i.']<br>\n"; ?'.">\n"; 
} 

cache!>
erzeugt in der con_code:

Code: Alles auswählen

<?php 
echo date('l, d. F Y');
?>
<?php echo "CMS_HTML[1]<br>\n"; ?>
<?php echo "CMS_HTML[2]<br>\n"; ?>
<?php echo "CMS_HTML[3]<br>\n"; ?>
<?php echo "CMS_HTML[4]<br>\n"; ?>
<?php echo "CMS_HTML[5]<br>\n"; ?>
<?php echo "CMS_HTML[6]<br>\n"; ?>
<?php echo "CMS_HTML[7]<br>\n"; ?>
<?php echo "CMS_HTML[8]<br>\n"; ?>
<?php echo "CMS_HTML[9]<br>\n"; ?>
<?php echo "CMS_HTML[10]<br>\n"; ?>
wobei das CMS_HTML[X] dann jeweils durch den con type ersetzt wird...

man kann auch auf CMS_VALUE[X] werte innerhalb des gecachten bereichs zugreifen....

meine empfehlung ist es dort einzusetzen wo man nicht auf dynamische daten zugreifen muss..
Zuletzt geändert von emergence am Fr 23. Sep 2005, 13:08, insgesamt 1-mal geändert.
*** make your own tools (wishlist :: thx)
wewo
Beiträge: 45
Registriert: So 8. Aug 2004, 19:08
Wohnort: Graz
Kontaktdaten:

Beitrag von wewo »

hi emergence,
hab mal die änderungen in einem frischen snapshot (cvs-2005-09-16) gemacht und bekomm leider nur

Code: Alles auswählen

<?php
echo date('l, d. F Y');
?>

in der con_code ausgegeben :(

Any Ideas?

Eigentlich such ich ja eher endlich eine Möglichkeit

Code: Alles auswählen

//pseudocode:
for ($i=0; $i < "CMS_VALUE[1]"; $i++){
echo "CMS_IMGEDIT[".$i."]";
}
zu realisieren und dachte deine Erweiterung würde das ermöglichen :?

lg
wewo
emergence
Beiträge: 10653
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence »

ich hab in der for schleife im beispiel jetzt was geändert... < statt ==
das beispiel sollte nun gehen...
*** make your own tools (wishlist :: thx)
wewo
Beiträge: 45
Registriert: So 8. Aug 2004, 19:08
Wohnort: Graz
Kontaktdaten:

Beitrag von wewo »

oh man :)
dein beispiel geht jetzt. mal schauen wo es bei meinem modul klemmt :evil:

danke jedenfalls für die schnelle antwort
wewo
emergence
Beiträge: 10653
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence »

das was du machen möchtest müsste so aussehen...

Code: Alles auswählen

<!cache 

for ($i = 1; $i < "CMS_VALUE[1]"; $i++) { 
    echo "<".'?php echo "CMS_IMGEDIT['.$i.']"; ?'.">\n"; 
} 

cache!>
*** make your own tools (wishlist :: thx)
Antworten