Cache Smarty
Smarty jest bardzo popularnym systemem szablonów dla php oprócz podstawowych funkcjonalności charakterystycznych dla systemów szablonów posiada on całkiem niezły system cachowania zawartości.
Podstawy buforowania w smarty
Cachowanie dla szablonów jest domyślnie wyłączone , można je włączyć w skrypcie ustawiając właściwości $smarty->caching = 1 .
1 2 3 4 5 6 | <?php include_once('smarty/Smarty.class.php'); $smarty = new Smarty; $smarty->caching = 1; $smarty->display('templates/template.tpl'); ?> |
Dzięki ustawieniu zmiennej caching na 2 mamy dodatkowe możliwości regulowania czasu przechowywania bufora $smarty->cache_lifetime = 7200 (dwie godziny).
Jeśli zachodzi potrzeba odświeżenia szablonu w buforze np. gdy szablon został zmodyfikowany możemy użyć zmiennej $smarty->compile_check = true, wtedy smarty sprawdza czy plik szablonu powiązany z plikiem w buforze nie został zmieniony, jeśli tak bufor jest odświeżany. Nie jest to zbyt wydajne ale możemy zastosować to ustawienie np. podczas pracy nad szablonami.
Smarty daje nam również możliwość sprawdzenia czy dany szablon znajduje się w buforze,
robimy to za pomocą $smarty->is_cached(’templates/template.tpl’).
1 2 3 4 5 6 7 | ... if(!$smarty->is_cached('templates/template.tpl')) { //pobieramy dane //przypisujemy dane do szablonu } $smarty->display('templates/template.tpl'); |
Czyszczenie bufora
Pliki z bufora możemy usuwać bezpośrednio odwołując się do nich poprzez nazwę
$smarty->clear_cache(’templates/template.tpl’)
lub wyczyścić cały bufor poprzez:
$smarty->clear_all_cach()
Możemy również utworzyć skrypt który będzie nam usuwał nieaktualne pliki z bufora podając jako parametr czas ważności bufora jeśli w jakimś pliku czas jest przekroczony to zostanie on automatycznie usunięty (może to być skrypt uruchamiany przez crona).
$expiration_time = 2*60*60; //dwie godziny
$smarty->clear_all_cach($expiration_time);
Zawansowane możliwości buforowanie w smarty
W przypadku bardziej skomplikowanych witryn smarty oferuje nam bardziej zaawansowane możliwości cachowania. Normalnie bufor jest przypisany do szablonu, jak wiemy szablon wykorzystywany jest zwykle wielokrotnie np. w aktualnościach. Smarty pozwala na utworzenie wielu buforów dla jednego szablonu. Wystarczy do metody display przekazać drugi parametr np. id aktualności.
1 2 3 4 5 6 7 8 9 10 11 | ... $smarty->template_dir = 'templates/'; $newsId = (int) $_GET['id']; // $_GET['id'] np. 125 if(!$smarty->is_cached('template.tpl', 'template|'.$newsId)) { //pobieramy dane //przypisujemy dane do szablonu } $smarty->display('template.tpl', $newsId); |
Bufory dla wszystkie newsów zostaną utworzone w folderze cache (jeśli go wcześnie ustawiliśmy w konfiguracji smarty), będzie to np. template^125^%%…news.tpl.
Przy jeszcze bardziej złożonych witrynach gdzie liczbę newsów i artykułów liczymy czasem w tysiącach, nie jest to jednak najlepsze rozwiązanie ponieważ wszystkie pliki bufora dla wszystkich działów są umieszczane w tym samym katalogu co może spowolnić dostęp do tych plików.
Grupy buforów
Kolejną możliwością buforowania w smarty jest rozdzielenie poszczególnych grup buforów na foldery ustawiając zmienną $smarty->use_sub_dir = true i dodanie w metodzie display nazwy folderu dla grupy buforów
1 2 3 4 5 6 7 8 9 10 11 12 | ... $smarty->template_dir = 'templates/'; $smarty->use_sub_dirs = true; $newsId = (int) $_GET['id']; // $_GET['id'] np. 125 if(!$smarty->is_cached('template.tpl', 'template|'.$newsId)) { //pobieramy dane //przypisujemy dane do szablonu } $smarty->display('template.tpl', 'template|'.$newsId); |
W wyniku tego w folderze cache smart tworzy określoną strukturę
cache\template\125\%%…template.tpl
Czyszczenie grup buforów
Czyszczenie grup buforów jest tak samo proste jak pojedynczych buforów
$smarty->clear_cache(null, ‘template’).
Smarty daje nam również możliwość zablokowanie cachowania, możemy to zrobić na trzy sposoby:
- Zablokowanie buforowania dla pliku poprzez ustawienie zmiennej $smarty->caching = 0
- Zastosowanie dla dynamicznej zawartości funkcji {insert}
- Utworzenie własnej wtyczki, która blokuje buforowanie wskazanej części szablonu np. {nocache}{/nocache}
Podsumowanie
W systemach, których integralną częścią jest smarty, możliwość cachowania może być doskonałym rozwiązaniem poprawiającym wydajność całej witryny. Dodatkowe informacje na ten temat można znaleźć w dokumentacji smarty i w dziale caching.