Caching sollte man generell immer verwenden, wenn es geht ;-).
Eine tolle, aber leider noch wenig verbreitete Variante bei Zend
ist die Frontend_Class.
Dies liegt vlt. auch daran, weil sie im Gegensatz zu anderen weniger dokumentiert ist.
Deshalb zeige ich heute euch mal eine einfache Anwendungsmöglichkeit.
Szenario
Ich will die Sql´s, welche über einen Mapper angesprochen werden cachen.
Damit ich nicht jede einzelne Methode mit der CacheAbfrage ausstatten will,
soll dies gleich für alle Methoden gelten.
Cache erstellen
Der Cache wird über die Factory Methode erstellt und steht dann der Application
zur Verfügung. Als “cached_entity” nehme ich den UserMapper aus dem Admin Module.
Dieser beinhaltet die SQL Funktionen.
public function init() { $user = new Admin_Model_Mapper_UserMapper(); /* Initialize action controller here */ $this->_cache = Zend_Cache::factory('Class', 'File', array('lifetime' => null, 'cached_entity' => $user, ), array( 'cache_dir' => APPLICATION_PATH . '/../data/cache/class/', 'automatic_serialization' => true, ) ); }
Der Mapper
Den Mapper habe ich jetzt mal übersichtlich gestaltet und 2 Methoden implementiert.
Wie ihr seht ist hier nichts, das auf Caching hinweist.
<?php class Admin_Model_Mapper_UserMapper { public function getUserById($id) { return Doctrine::getTable('Admin_Model_User')->find($id)->toArray(); } public function getAllUsers() { $query = Doctrine_Query::create() ->select('*') ->from('Admin_Model_User u'); return $query->execute()->toArray(); } }
Der Controller
In dem Controller, in welchem wir auch den Cache erstellt haben, befindet sich nun auch der Aufruf
der Methoden und somit die Cacheerstellung.
<?php class Admin_TenantController extends Zend_Controller_Action { public function init() { $user = new Admin_Model_Mapper_UserMapper(); /* Initialize action controller here */ $this->_cache = Zend_Cache::factory('Class', 'File', array('lifetime' => null, 'cached_entity' => $user, ), array( 'cache_dir' => APPLICATION_PATH . '/../data/cache/class/', 'automatic_serialization' => true, ) ); } public function indexAction() { // action body $user = $this->_cache->getUserById(1); $users = $this->_cache->getAllUsers(); $this->view->user = $user; $this->view->users = $users; } }
Das war es auch schon. Nun wird beim ersten Aufruf der Seite der Cache erstellt über die __call Methode der Cache-Klasse. Beim erneuten Aufruf werden die Daten direkt aus dem Cache geholt und keine DB abfrage mehr durchgeführt.
Hinweis: Vergesst natürlich nicht die Tabelle und das Verzeichnis für den cache zu erstellen.