La totalité des données générées par une action est mise en cache sous forme de page HTML, que le serveur web peut délivrer directement sans faire appel à Stato. Le gain de performance est bien sûr énorme, mais cette forme de mise en cache ne peut être utilisée que sur des contenus statiques, auxquels les utilisateurs peuvent accéder sans être loggés. L'expiration du cache se fait manuellement, en appelant la méthode expire_page.
class PhotosController extends ApplicationController { public $cached_pages = array('index', 'view', 'new'); ... public function update() { ... $this->flash['notice'] = 'Photo enregistrée.'; $this->expire_page(array('action' => 'view', 'id' => $this->params['photo']['id'])); $this->redirect_to(array('action' => 'view', 'id' => $this->params['photo']['id'])); } }
La totalité de la réponse est mise en cache, mais la requête passe quand même par le controller, et donc par les filtres. L'intérêt est de pouvoir mettre en cache des pages nécessitant une authentification par exemple.
class PhotosController extends ApplicationController { public $before_filters = array ( array('authenticate', 'except' => 'index') ); public $cached_pages = array('index'); public $cached_actions = array('view', 'new'); }
2 méthodes de la classe SActionView accessibles depuis vos templates vous permettent de mettre en cache des blocs de HTML sans avoir à mettre en cache l'intégralité de la page. C'est très pratique quand certains éléments de votre pages changent rarement, alors que d'autres changent très fréquemment.
<? if (!$this->cache_start()) : ?> <h3>Alls users</h3> <ul> <?= $this->render_partial_collection('user', $this->users); ?> </ul> <? $this->cache_end(); ?> <? endif; ?>
Le fragment sera rattaché au nom de l'action en cours. Vous pourrez donc l'invalider en appellant expire_fragment(array('controller'⇒'users', 'action'⇒'list')) si c'était le couple controller/action utilisé. Bien sûr, cela peut poser problème si vous souhaitez mettre en cache plusieurs fragments dans une action ou si l'action elle-même est mise en cache. Vous pouvez donc préciser vous-même le nom de l'action et un suffixe de cette façon :
<? if (!$this->cache_start(array('action' => 'list', 'action_suffix' => 'all_users')) : ?> // to expire fragment $this->expire_fragment(array('action' => 'list', 'action_suffix' => 'all_users'));
Le fichier généré sera ainsi users/list/all_users et n'interférera pas avec d'autres fichiers de cache.