Smarty Forum Index Smarty
WARNING: All discussion is moving to https://reddit.com/r/smarty, please go there! This forum will be closing soon.

Caching einer Seite bestehend aus cachebaren Elementen

 
This forum is locked: you cannot post, reply to, or edit topics.   This topic is locked: you cannot edit posts or make replies.    Smarty Forum Index -> Language: German
View previous topic :: View next topic  
Author Message
coach
Smarty Regular


Joined: 03 Jun 2004
Posts: 65

PostPosted: Thu Jun 03, 2004 7:37 pm    Post subject: Caching einer Seite bestehend aus cachebaren Elementen Reply with quote

Hallo,

ich möchte gerne eine bestehende Seite: www.tauchbasen.net auf Smarty umstellen (ich habe schon einige Erfahrung mit Smarty).

Neben der bestehenden Funktionalität möchte ich gerne noch benutzerspezifische Inhalte auf den Seiten ausgeben, was damit ein 100% Caching ausschließt! Dann würde ich gerne gewisse Teile der Seite, die z.B. auf mehreren Seiten vorkommt evtl. bloß einmal cachen aber mehrfach verwenden.

Momentan habe ich für jeden Usecase ein Script, z.B.

country.php:
- erzeuge manager: $my_manager = new divebase_manager;
- hole land: $my_manager->getCountryById($country_id);
- hole basen im land: $my_divebases = $my_manager->getDivebasesByCountryId($country_id);
- dann gebe ich im Script das HTML

divebase.php:
- erzeuge manager: $my_manager = new divebase_manager;
- hole basis: $my_manager->getDivebaseById($country_id);

In einem anderen Projekt arbeite ich ähnlich, außer das ich die Objekte dann an Smarty übergebe und dort rendere.

Ich arbeite dort mit einem Master-Template, welchem ich ein Content-Template übergebe

Code:

<html>
  <body>
    <table>
      <tr>
        <td>{include file=$content_tempate}<td>
      </tr>
    </table>
  <body>
<html>


Jetzt möchte ich gerne diesen Teil, z.B. für eine Basis cachen, aber trotzem noch weitere Elemente hinzufügen.

Mehrere Ansätze fallen mir ein:

Plugin 1:
Ich registriere ein Plugin und hole dann zur Ausgabe-Zeit den user-spezifischen Inhalt über ein PHP-Script. Das Template ist damit gecached, aber die Ausgabe kann ja nicht gecached werden.
Finde ich aber wegen meiner Manager etwas unsauber.

Plugin 2:
Ich registriere ein Plugin und rufe dann zur Ausgabe-Zeit meinen Server per HTTP-Request auf und habe dort wieder ganz normal ein Script welches nur einen Teil der Seite generiert und sogar cachen kann. Finde ich sauberer als Plugin 1. So könnte ich quasi Fragmente erzeugen für z.B. Top 10, Statistiken, User-Bookmarks ...
Hat aber auch das Problem wie oben, die Seite liegt nicht im Cache, sondern ich habe nur das compilierte Template.

Header, Navi und Footer:
Im Script wird für jeden Teil der Seite ein Cache-Eintrag erzeugt und bei Bedarf aus dem Cache geholt. Also ein Aufruf von mehreren $smarty->display
Finde ich auch nicht so gut, da ich gerne mehrere Scripte benutzen möchte und nicht ein Script haben will, welches auf die verschiedenen Use-Cases reagiert. Evtl. kann ich aber über ein Seiten-Objekt was sauberes hinbekommen.
Das hat schon einmal den Vorteil, daß ich zumindestens Teile komplett gecached habe.

Ersetzung:
Ich erzeuge normal die Seite und habe quasi Platzhalter. Diese werden von meinem Script mit dynamischen Inhalten gefüllt. Also mit fetch() holen, und dann ersetzen.


Wahrscheinlich gibt es noch mehr Möglichkeiten. Habt ihr Vorschläge, Anregungen, Ideen, Lösungen, wie ich die Umstellung auf Smarty am besten lösen kann?

Was ich dabei eigentlich gerne behalten möchte:
- ein Script pro Use-Case (auch wenn es etwas Overhead ist, aber je größer das Projekt dann wird, desto einfacher ist es zu warten, erweitern - finde ich)
- Datenbank-Zugriffe sollten "gecached'" werden (ein compiliertes Template ist sicher schneller als ein PHP-Script, welches jedes Mal die Daten aus der DB holt)
- eine schöne Lösung für Elemente

Grüße
Maik
Back to top
View user's profile Send private message
messju
Administrator


Joined: 16 Apr 2003
Posts: 3336
Location: Oldenburg, Germany

PostPosted: Tue Jun 08, 2004 1:02 pm    Post subject: Re: Caching einer Seite bestehend aus cachebaren Elementen Reply with quote

hmm, ich weiss nicht ob ich das alles verstanden habe, also nicht böse sein wenn ich bullshit schreibe.

coach wrote:

Was ich dabei eigentlich gerne behalten möchte:
- ein Script pro Use-Case (auch wenn es etwas Overhead ist, aber je größer das Projekt dann wird, desto einfacher ist es zu warten, erweitern - finde ich)


du meinst damit http://server/usecase.php statt einer index.php?do=usecase ?

Quote:
- Datenbank-Zugriffe sollten "gecached'" werden (ein compiliertes Template ist sicher schneller als ein PHP-Script, welches jedes Mal die Daten aus der DB holt)


nein. ein compiliertes template *ist* ein php-script.

datenbankzugriffe cachest du am einfachsten, indem du $smarty->is_cached() verwendest und damit datenbank-zugriffe vermeidest.

[php:1:1ee079c9c3]if (!$smarty->is_cached($template, $cache_id)) {
ganz viele queries an die datenbank senden und ganz viele
template-veriablen assignen
}
$smarty->display($template, $cache_id);[/php:1:1ee079c9c3]

Quote:
- eine schöne Lösung für Elemente


eine idee wäre ein plugin als "not cacheable" zu registerieren, das untertemplates per fetch() bezieht. so kann man für jedes untertemplate eigene cache-settings setzen.

- $id als parameter übernehmen
- alte cache-settings in temp-variables sichern
- cache-settings auf irgendwie sinnvolle defaults setzten
- $cache_id und $template auf sinnvolle defaults setzten
- wenn ein file "$id.php" existiert dieses included
(dieses element-include kann dann cache-setting setzen und $cache_id und $template evtl. überschreiben. zusätlich sollte dieses include die nötigen daten, die zur darstellung des element-templates nötig sind, laden und assignen)
- dann das template $template fetchen
- cache_settings auf original-werte zurücksetzen
- gefechten content zur darstellung zurückliefern

damit kann man im template dann

{element id=top10} aufrufen und man muss sich im template nicht drum kümmern ob top10 für 3h oder 24h gecached wird oder gar nicht, darum kümmert sich die top10.php

auch ein {element id=$main_element} (statt deines "{include file=$main_template}") sollte funktionieren.

du hast dann evtl. 2 files pro use case:

htdocs/country.php:[php:1:1ee079c9c3]
include "config.php";
$smarty->assign('main_element', 'country');
$smarty->display("main.tpl");[/php:1:1ee079c9c3]

und eine elements/country.php[php:1:1ee079c9c3]
$template = "country.tpl";
$cache_id = $country_id;
if (!$smarty->is_cached($template, $cache_id)) {
- erzeuge manager: $my_manager = new divebase_manager;
- hole land: $my_manager->getCountryById($country_id);
- hole basen im land: $my_divebases = $my_manager->getDivebasesByCountryId($country_id);
}
// wird vom elements-plugins gefetched und ausgeben
[/php:1:1ee079c9c3]

das ganze ist vielleicht auch nicht super-sauber aber verhältnismäßig einfach und flexibel.
Back to top
View user's profile Send private message Send e-mail Visit poster's website
coach
Smarty Regular


Joined: 03 Jun 2004
Posts: 65

PostPosted: Wed Jun 09, 2004 4:13 pm    Post subject: Re: Caching einer Seite bestehend aus cachebaren Elementen Reply with quote

coach wrote:

du meinst damit http://server/usecase.php statt einer index.php?do=usecase ?


Ja genau.

Quote:

nein. ein compiliertes template *ist* ein php-script.

datenbankzugriffe cachest du am einfachsten, indem du $smarty->is_cached() verwendest und damit datenbank-zugriffe vermeidest.


Mein Denkfehler.

Quote:

{element id=top10} aufrufen und man muss sich im template nicht drum kümmern ob top10 für 3h oder 24h gecached wird oder gar nicht, darum kümmert sich die top10.php


So etwas schwebte mir in den vergangenen Tagen auch in etwa vor.

Theoretisch würde ich in drei Element-Typen unterscheiden:
- userspezifisch, z.B. Basen-Bookmarks
- kurz cachebar, z.B. stündliche Statistiken von Klicks der Basen eines Landes
- lange cachebar, z.B. wöchentliche Statistiken
Jetzt mal schauen, ob ich da programmiertechnisch unterscheiden muß.

Für den ersten und zweiten Element-Typ könnte ich mit deinen genannten "nicht cachebarem Plugin" arbeiten, während ich für den dritten Typ mit "cachebaren Plugins" arbeite.

Der dritte Typ muß doch - wenn ich richtig denke - unabhängig von allen Parametern sind. Wenn das Element in Template1 eingebunden ist und erstmalig aufgerufen wird, sollte es im Cache landen. Wenn es dann - in Template2 eingebunden - aufgerufen wird, nicht ausgeführt werden und der Inhalt am besten aus dem Cache genommen werden? Da wird dann doch theoretisch das Plugin garnicht mehr aufgerufen, weil der Smarty-Kern den Inhalt aus dem Cache nimmt?
Falls ich mich da irre, nutze ich auch für Typ 3 das "nicht cachebare plugin".

Beim ersten Typ kann ich ja im Element-Script selber anhand diverser Request-Parameter, Session-Parameter eine Cache-Id berechnen.

Schön wäre es für Typ 2, wenn ich bspw. ein Top3Land-Element habe, das falls im Cache schon ein Eintrag element_top3country_$id liegt, nicht aufgerufen wird. Zum einen könnte ja das Element (PHP-Script) die Cache-Id berechnen und gucken ob in Cache existiert (wenn ja fetchen) oder das Plugin kann das. Wenn ich also das Element wie folgt einbinde:
Code:
{element id="top3country" cache_extension=$country_id}
- falls ich da überhaupt noch an die $country_id rankomme, weil die mit Werten assignte Smarty-Instanz ja nicht mehr existiert. Oder ich hole die country_id aus dem Request-Parameter bzw. im Haupt-Script weiß ja auch die country_id.

Vielleicht hast du das auch so gesagt oder gemeint.

Ich glaube, dass muß ich mal sacken lassen und evtl. mal ancoden.

Komme ich eigentlich in den Elementen an die Manager-Instanz ran ohne eine neue erzeugen zu müssen? Also bspw. eine Funktion
Code:
getManager()
, welche guckt, ob eine Instanz existiert und im Zweifelsfall erzeugt.

Quote:

das ganze ist vielleicht auch nicht super-sauber aber verhältnismäßig einfach und flexibel.


Ich habe mal mit einem Apache-Mod gearbeitet, welches mittels einer Sitemap (in XML) Elemente, Cache-Parameter verwaltet hat. War etwas sauberer und konnte auch auf Cache-Manager zugreifen, die sich sogar synchronisieren konnten.



Maik
Back to top
View user's profile Send private message
Display posts from previous:   
This forum is locked: you cannot post, reply to, or edit topics.   This topic is locked: you cannot edit posts or make replies.    Smarty Forum Index -> Language: German All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group
Protected by Anti-Spam ACP