Ankündigung

Einklappen
Keine Ankündigung bisher.

Caching

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Caching

    Habe mir nun mal Smarty angeschaut und komme auch sehr gut damit zurecht. Dennoch bin ich mit dem caching noch am rätseln und die Einträge auf der offiziellen Smarty Seite konnten mir noch nicht ganz weiterhelfen.

    Caching beteuted ja, dass für eine angegebene Zeit das anzuzeigende bereits gespeichert ist und dann aufgerufen wird, ohne große Ladezeit.

    Wie unterscheidet sich das ganze nun zu einem normalen Browser Cache? Wird beim Browser-Cache nur z.B. ein Bild gespeichert und dann wieder aufgerufen und bei dem Smarty Cache alles, sodass bei dem Smarty Cache für eine bestimmte Zeit nichts verändert wird?

    --- Falls jemand in Smarty Kenntnisse hat:

    Meine Cache Dateien zu den .tpl Dateien werden erstellt, dennoch scheint es mir, dass das caching nicht wirklich Wirkung zeigt. Wie genau muss ich mir das caching von Smarty vorstellen?

    PHP-Code:
    require_once('libs/Smarty.class.php');
        
        
    $smarty = new Smarty();
        
        
    $smarty->template_dir 'templates';
        
    $smarty->compile_dir 'cache';
        
        
    $smarty->setCaching(Smarty::CACHING_LIFETIME_SAVED);
        
    $smarty->setCacheLifetime(30);

    /* Anzeigen von Templates ... */ 

  • #2
    Guck in die Caching-Dateien, dann weißt Du es.

    Kommentar


    • #3
      Das ganze hat natürlich auch nur dann Wirkung wenn du bei bereits existierenden Caches Arbeitsvorgänge weglässt. Das Template-Rendern ansich ist ein Vorteil wenn du caching nutzt, da du dir dann auch das befüllen von Template-Variablen nebst einhergehender Datenbankabfragen sparen kannst, ein wesentlich größerer.

      PHP-Code:
      $smarty = new Smarty();

      $smarty->setCaching(Smarty::CACHING_LIFETIME_SAVED);
      $smarty->setCacheLifetime(30);

      if ( !
      $smarty->isCached('template.tpl') ) {
         
      /* datenbank abfragen und $smarty->assign(...) */
      }

      $smarty->display('template.tpl'); 

      Kommentar


      • #4
        Danke, das hab ich benötigt. Gibt es einen Weg, zu schauen ob das caching funktioniert? Das heißt ich habe es wie folgt getestet, aber das wird natürlich nicht funktionieren, da die Nachricht 'Cache erstellt!' mit in die Cache-File übernommen wird.

        PHP-Code:
        $smarty = new Smarty();

        $smarty->setCaching(Smarty::CACHING_LIFETIME_SAVED);
        $smarty->setCacheLifetime(30);

        if ( !
        $smarty->isCached('template.tpl') ) {
           
        /* datenbank abfragen und $smarty->assign(...) */
           
        print_r('Cache erstellt!');
        }

        $smarty->display('template.tpl'); 

        Kommentar


        • #5
          Was heißt „funktioniert“?

          Kommentar


          • #6
            Ein bissl mehr Phantasie bitte: Erzeug eine Log-Datei, und füg beim erstellen des Caches dort eine Statusnachricht ein...

            PHP-Code:
            $smarty = new Smarty(); 

            $smarty->setCaching(Smarty::CACHING_LIFETIME_SAVED); 
            $smarty->setCacheLifetime(30); 

            if ( !
            $smarty->isCached('template.tpl') ) { 
               
            /* datenbank abfragen und $smarty->assign(...) */ 
               
            file_put_contents(
                  
            'cache.log'
                  
            date_create()->format('Y-m-d H:i:s').
                     
            ' Cache erstellt für template.tpl !'.PHP_EOL
                  
            FILE_APPEND
               
            );


            $smarty->display('template.tpl'); 

            Kommentar


            • #7
              Habe nun nach mehreren Testläufen meinen Denkfehler gefunden. Included .tpl Files werden zwar compiled aber nicht einzeln gecached, sondern direkt mit der eigentlichen .tpl File gecached. Danke für die Hilfe.

              Kommentar


              • #8
                fetchen und assignen, nicht includen, sondiert die cache-flexibilität, ansonsten kannst du auch in-template caching steuern.

                Kommentar


                • #9
                  Ich bin nun auf ein weiteres Problem gestoßen:

                  Ich habe soeben einen Login erstellt und habe somit auch Fehlermeldungen drin, falls zum Beispiel kein Benutzername eingegeben wurde. Nun wird es aber nur möglich sein, eine neue Fehlermeldung 30 Sekunden dannach zu erhalten. Das heißt, dass falls ein Benutzer innerhalb der 30 Sekunden einen anderen Fehler machen wird, wird er immernoch den alten angezeigt bekommen. Dabei habe ich nicht einmal getestet, ob überhaupt schon gecached wurde (Mit isCached()).

                  PHP-Code:
                  if(!isset($_SESSION['angemeldet'])) // Testen, ob man schon angemeldet ist.
                  {
                      include 
                  'login.php'// Login überprüfen, enthält Abfrage, ob der Login-Button gedrückt wurde.
                      
                  $smarty->assign('error'$error); // Error oder std. Nachricht ausgeben.
                      
                  $smarty->display('login.tpl'); // Template ausgeben.

                  Kommentar


                  • #10
                    Für permanent unkontrollierbaren Content ( Seiten die nicht gecached werden sollen ) einfach den Cache abschalten ( $smarty->caching = false ) oder immer übergehen ( $smarty->force_compile = true ).

                    Edit: Eins noch:

                    Du solltest nicht planlos durch die gegend Cachen, es genügt meist nur partiell zu Cachen, also bestimmte Seiten die viel "Arbeit" bedeuten. Grundsätzlich solltest du dir bei Smarty auch mal Template-Inheritance anschauen, sodas du nicht x mal die selben Templates bauen musst.

                    Kommentar


                    • #11
                      Okey, wenn ich nun aber mit mehreren Templates arbeite muss ich es ja für verschiedene Templates verschieden einstellen. Wäre es eine gute Lösung vor jedes $smarty->display() ein $smarty->caching zu setzen, um es so zu kontrollieren?

                      Kommentar


                      • #12
                        Bedingt, das musst du spezifisch planen, generell solltest du global einen schalter setzen ( eine Class extension der Smarty klasse ) das Caching an oder ausknippst ( meinetwegen sogar per Configurationsinterface ) und für Smarty-Instanzen die nicht cachen sollen entsprechend permanent auslässt.

                        Wie genau sowas aussieht zeigt diese "Techdemo": http://www.smarty.net/docs/en/instal...y.extended.tpl

                        Die Klasse würd dann bei dir statt Smarty_Guestbook, dependCachingSmarty oder sonstwie heißen. Prinzipiell aber "genauso" arbeiten. Seiten die "Cachen können" erzeugen dann statt
                        PHP-Code:
                        $smarty = new Smarty(); 
                        halt
                        PHP-Code:
                        $smarty = new dependCachingSmarty() 
                        fertig.

                        Kommentar


                        • #13
                          Bedeutet ich stell in der index.php erstmal den Schalter auf 'false' und erstelle zwei Objekte. Objekt 1: Nicht cachen, Objekt 2: Cachen. Im Konstruktor der 'extended' Klasse muss ich nun eben den Konstruktor der Elternklasse aufrufen und das caching auf 'true' setzen. Die Überlegungen im Code (gibt es was zu verbessern? ):

                          PHP-Code:
                          class SmartyCachingOn extends Smarty {
                             private function 
                          __construct()
                             {
                                  
                          parent::__construct();

                                  
                          /* Ordner für die automatisch erstellten Dateien ... */

                                  
                          $this->caching true;
                                  
                          $this->setCaching(Smarty::CACHING_LIFETIME_SAVED);
                                  
                          $this->setCacheLifetime(20);
                             }
                          }

                          $smarty = new Smarty();
                          $smartyCacheOn = new SmartyCacheOn();

                          $smarty->caching false;

                          /* Rendern der Webseite ...  - $smarty bei nicht zu cachen'den
                          Templates verwenden und $smartyCacheOn, falls dies erwünscht ist.*/ 

                          Kommentar


                          • #14
                            Generell würde ich Smarty in deinem Fall direkt als View implementieren.

                            PHP-Code:
                            class uncachedView
                               
                            extends Smarty
                            {

                               public function 
                            __construct()
                               {
                                  
                            parent::__construct();

                                  
                            $this->caching false;
                               }

                            }

                            class 
                            cachedView
                               
                            extends Smarty
                            {

                               public function 
                            __construct$generalCacheTime 20 )
                               {
                                  
                            parent::__construct();

                                  
                            $this->caching Smarty::CACHING_LIFETIME_SAVED;
                                  
                            $this->cache_lifetime = (int)$generalCacheTime;
                               }


                            Entsprechend an den Stellen wo templates geladen werden die gecached werden sollen cachedView nutzen, andernfalls uncachedView

                            PHP-Code:
                            /* irgendwo im fernen Controller ::init() */

                            $caching = isset($config['caching']) ? true false;
                            $caching $caching ? (bool)$config['caching'];

                            $cacheLifetime = isset($config['cache_lifetime']) ? true false;
                            $cacheLifetime $cacheLifeTime ? (int)$config['cache_lifetime'] : false;

                            if ( 
                            $caching ) {
                               if ( 
                            $cacheLifeTime ) {
                                  
                            $this->view = new cachedView($cacheLifeTime);
                               }
                               else {
                                  
                            $this->view = new cachedView;
                               }
                            }
                            else {
                               
                            $this->view = new uncachedView;

                            Kommentar


                            • #15
                              Gut, ich bin jetzt nicht ganz mitgekommen, daher kurz eine Frage. Es werden also zwei extended Klassen erstellt, die die Templates entweder cachen oder nicht cachen werden. Soweit alles klar.
                              Nun dennoch zum zweiten Teil deiner Erklärung: Woher kommen die Daten in $config genau? Ich habe versucht die Smarty config ausgeben zu lassen u.a. mit getConfigVars(), was zu einem Misserfolg führte.
                              Nachdem du nun die Daten aus der Config hast, setzt du nun gecache'de Templates mit std. oder eigener Lifetime bzw. ein nicht gecachtes Template.
                              Du verwendest hier ebenfalls $this->view, wodruch ich mich doch frage, was hier genau angestellt wird. Erstellst du ein neues Objekt? Ich habe kurz gegoogled und bin auf MVC gestoßen, hat es damit was auf sich?

                              Kommentar

                              Lädt...
                              X