Blondie: Smarty Caching - Mod Rewrite

Hallo,

ich bin mir nicht ganz sicher, ob der Themenbereich passt..

Ich nutze -wie im Thema schon angedeutet- Mod_Rewrite, um meine URLs zu verschönern.
Eine URL wie example.com/1/2 wird dann per mod_rewrite auf  example.com/main.php?id=1&subid=2 *umgeleitet*. Soweit stellt das ja kein Problem dar.

Nun nutze ich dazu noch Smarty als Template-Engine. Das heisst, in main.php findet man dann solche Konstrukte:

  
$smarty->assign('someVar',$someValue);  
$smarty->caching = false;  
$smarty->display("header.tpl");  
$smarty->display("body.tpl");  
$smarty->display("footer.tpl);  

Soweit, so gut. Das funktioniert natürlich alles sehr gut.
Auf meiner Website gibt es ungefähr 20 Pages, die mit URLs wie oben beschrieben (example.com/dit/dat) aufgerufen werden und auf main.php mitsamt der folgenden Smarty-Zuweisung gemappt und mit Hilfe der entsprechenden 3 Templates (header, body, footer) ausgegeben werden.

Konkret bedeutet dies, dass ALLE Pages natürlich diese 3 Templates nutzen.

Mein Problem:

Setze ich caching auf true, bekomme ich nur immer eine Seite zu sehen, und zwar genau die, die ich ZUERST (nachdem der Smarty-Cache manuell geleert wurde) aufrufe, z.b. example.com/start. Egal welchen Link in der Navigation ich klicke.

Es scheint so, als ob Smarty den Cache auf "main.php" bezieht ... besser kann ich es nicht erklären.

Hat jemand einen Tip? Meine Google-Suche brachte keinen Erfolg

Blondie

  1. Moin!

    Ja. Das Chaching von Smarty ist nicht besonders ausgereift

    Schreib Dir diesen Spaß so um, dass Dein eigener Cache-Handler die query (?id=1&subid=2) mit berücksichtigt.

    $smarty->cache_handler_func = 'DEIN_cache_handler';

    In der der Funktion DEIN_cache_handler() musst Du dann natürlich $_SERVER['QUERY_STRING'].$_PHP['SELF'] oder gleich $_SERVER['REQUEST_URI'] verwenden.

    Eine Möglichkeit wäre dort mit:

    $CacheID = md5($_SERVER["REQUEST_URI"].$compile_id)

    statt  $CacheID = md5($tpl_file.$cache_id.$compile_id);

    zu arbeiten.

    alternierend zu der Funktion an der verlinkten Stelle (welche in die Datenbank schreibt) kannst Du die Daten natürlich auch in eine Datei schreiben: Benutze $CacheID dann einfach als Dateiname, etwas anderes macht der originale Cache auch nicht.

    Allerdings weise ich Dich darauf hin, dass der Cache dann sehr schnell sehr groß werden kann.

    Und bitte:

    statt 3x dieses: ' $return = $results;' und dann 'return $return;' kannst Du auch gleich return $results; schreiben.

    Beachte:

    An der angegebenen Stelle steht öfter '&' gemeint ist nur ein '&'. Da macht wohl das auf smarty.net verwendete CMS Ärger.

    MFFG (Mit freundlich- friedfertigem Grinsen)

    fastix

    1. Hi Fastix,

      vielen Dank! Das ist super! Werde ich mir heute abend mal angucken und probieren, ob das klappt! Dann ist der *Fehler* von Smarty also bekannt oder liegt das in der Natur der Sache?

      Viele Grüße
      Blondie

      1. Moin!

        oder liegt das in der Natur der Sache?

        Etwa verklausuliert steht es in der Online-Hilfe:

        Zitat aus Smarty: $caching

        "Definiert ob Smarty die Template-Ausgabe im Verzeichnis $cache_dir cachen soll. Normalerweise ist dies ausgeschaltet (disabled, Wert: 0). Falls Ihre Templates redundante Inhalte erzeugen ist es empfehlenswert, $caching einzuschalten. Die Performance wird dadurch signifikant verbessert. Sie können auch mehrere (multiple) Caches für ein Template haben."

        MFFG (Mit freundlich- friedfertigem Grinsen)

        fastix