Tento díl o Smarty šablonách bude o práci s cache a konfiguračními soubory webové aplikace.
25.4.2005 15:00 | MaReK Olšavský | přečteno 13101×
Cache
Použitím cache lze velice odlehčit zatížení Apache serveru při
zobrazování stránek, je však třeba postupovati s nejvyšší obezřetností,
protože špatné nastavení může snadno způsobit, že budou zobrazovány již
neplatné stránky. Například stránka s kontakty a dalšími informacemi,
které jsou modifikovány jednou za velice dlouhý čas může mít životnost
cache v minutách, ale stránky zobrazující například články a komentáře
by měly mít životnost nepoměrně kratší, případně po přidání komentáře,
nebo aktualizaci databáze článků vymazat stávající cachované soubory.
Různé části stránky mohou mít životnost cache souborů nastavenu na
různou dobu. Výjimku tvoří části stránek vložené pomocí Smarty funkce
insert, které se necacheují, což lze využít například k vložení částí s anketami, nebo bannery, které je třeba necacheovat.
Nastavení cache
K nastavení možnosti používat cache je třeba provést několika nastavení
na straně Smarty. Je možné tato nastavení provést buď přímým zásahem do
souboru
Smarty.class.php, nebo je zadat při vytváření třídy ve
scriptu. Aby byla objasněna i tato druhá možnost, která je použitelná
pro konfiguraci libovolných
parametrů za běhu scriptu, bude zde použita
právě tato metoda. Ti kteří preferují přímé nastavení v hlavní třídě si
mohou vlastnosti najít a modifikovat.
Pro použití cache je nutné nejprve nastavit proměnnou třídy Smarty
(toto nastavení bude pravděpodobně nejlepší provést přímo v souboru
Smarty.class.php)
$cache_dir,
která ukazuje na adresář do kterého budou ukládány cacheované soubory.
Pro tento adresář je nutné nastavit práva tak, aby do něj mohl
zapisovat web/php server.
Soubory do adresáře pro cache jsou ukádány s koncovkou .php a podobným jménem, jako zkompilované soubory do
$compile_dir. Nejedná se o spustitelné scripty a není doporučena jejich ruční editace.
Prvotní nastavení pro použití je proměnná třídy Smarty, která se jmenuje
caching, je typu Integer, s hodnotami v rozsahu 0-2 a následujícím významem:
- 0 - cachování nebude použito
- 1 - cache buda použita bez možnosti mít pro různé šablony (stránky) rozdílnou životnost cache
- 2 - cache použita s možností ovlivnit životnost pro jednotlivé stránky.
U běžného projektu bude nejpravděpodobněji použita varianta
$page->caching=2
.
Při použití třetí varianty (
$page->caching=2) je bráno v potaz nastavení vlastnosti
$cache_lifetime ze scriptu, zobrazující, nebo odchycující do proměnné, obsah šablony. Proměnná
$cache_lifetime
má výchozí hodnotu nastavenu na 3600 sekund (neboli jednu hodinu),
nastavení života cache pro stránku například na 10 minut se realizuje
pomocí přiřazení
$page->cache_lifetime=600
.
Použití cache
Po
základním nastavení je možné začít používat cacheování obsahu tvořeného
pomocí Smarty šablonovacího systému. Použití je velmi jednoduché a má
poměrně rozsáhlé možnosti, od ponechání automatického generování cache
pouze v závislosti na nastavení délky života cacheovaných souborů v
konfiguraci, až po různou životnost chache a jejich regeneraci/mazání v
závislosti na uložení textů či komentářů v redakčním systému.
Většinová praxe je taková, že jeden script (+ šablona) zobrazuje data
získaná z databáze, například artdetail.php (+ fe_artdetail.tpl
(protože mám pro šablony jeden adresář, rozlišuji prefixem 'fe_',
frontend, uživatelskou a 'adm_', administrátorské, šablony)), lze pro
funkce
display()
a
fetch()
použít přídavný parametr (cache_id), který umožní rozlišit, pro které
identifikátory je třeba nacacheovaný soubor smazat. Jedná se o
nepovinný parametr metody, na staně PHP scriptu, řetězcového typu. Jako
vhodný identifikátor se jeví například databázové id článku. Zobrazení
šablony s komentáři k článku s jedinečným identifikátorem
id může poté vypadat například takto:
$page->cache_lifetime = 600;
$output=$page->fetch('fe_comments.tpl',$_GET['id']);
$page->cache_lifetime=86400;
$page->display('fe_page.tpl');
V tomto minipříkládku je použito vložení dvou cacheovaných šablon do
sebe, přičěmž pro šablonu 'fe_page.tpl' lze mít cache nastavenu na
velice dlouhou životnost (v příkladu je to 1 den), protože určuje
layout stránky a ten se často nemění.
Pro vytvoření cacheovaných šablon není třeba žádné funkce, stačí
nastavit několik proměnných a šablonovací systém se postará o zbytek
potřebných operací sám. O smazání (ať selektivní, nebo centrální) se
musí programátor starat sám, mimo případu, kdy vyprší životnost
cacheovaného souboru.
Ke smazání všech nacacheovaných souborů slouží PHP metoda
clear_all_cache(),
který má jeden nepovinný parametr, jímž lze určit minimální stáří
souboru v sekundách. Tato varianta může posloužit v případě velkého
množství změn ve webové aplikaci, v naprosté většině ostatních případů
bude použitelné selektivní mazání. Smazání všech nacacheovaných souborů
starších 30 sekund se realizuje takto:
$page->clear_all_cache(30);
K selektivnímu mazání souborů slouží metoda šablony
clear_cache, která má následující parametry:
- jméno šablony, k níž patří nacacheovaný soubor, který je třeba smazat
- identifikátor šablony, se kterým byla cache vygenerována při fetch, nebo display,
kde byl přidán jako nepovinný přídavný parametr. Použije se například v
případě, že na jedné šabloně závisí dle databáze několik vygenerovaných
stránek, změní se obsah jediné z nich a je třeba smazat jen tu, které
se týká změněný záznam v databázi, tento parametr je nepovinný
- compile_id - nepovinný parametr, který, je-li použit, musí korespondovat s třetím parametrem použitým v metodách fetch a display
(tento parametr byl v tomto tutoriálu vynechán, více najdete v původní
dokumentaci na adrese <a
href="http://smarty.php.net">smarty.php.net</a>)
- čas minimálního stáří souboru ke smazání, podobné jako v předchozím případě.
Pro odlehčení zatížení PHP serveru se může jevit jako vhodné použití metody
is_cached(),
pomocí níž lze otestovat, zda-li je vygenerován a uložen cacheovaný
soubor a teprve není-li, pracovat s databází, generovat výstupy, ...
Bohužel častá a běžná chyba při práci s cache je ta, že bez ověření
existence uloženého souboru jsou získávána a zpracovávána data z
databáze, dochází ke spuštění
metod
fetch() a
display(),
které teprve v tento moment najdou uložené soubory a ty jsou
zobrazeny. Takto dojde k minimální úspoře strojového
času, což nemusí vadit u málo navštěvovaných stránek
na slabě zatížených serverech, ale při vývoji
webové aplikace, u které se počítá s větším, než malým zatížením je
třeba dbát na maximální výkonovou optimalizaci byť za cenu delšího a
nepřehlednějšího kódu. Metoda
is_cached() má pouze dva parametry, z nichž druhý je nepovinný, návratovou hodnotu lze testovat jako boolean:
- jméno šablony
- identifikátor šablony, se kterým byla cache vygenerována při fetch(), či display(), viz výše.
Příklad použití:
if(!$page->is_cached("fe_index.tpl")) {
//ziskani dat z databaze a jejich nasledne zpracovani
}
$page->cache_lifetime=600;
$output=$page->display("fe_index.tpl");
$page->cache_fifetime=86400;
$page->display("fe_page.tpl")
Předchozí funkce umožňují sgrupování/seskupení při ověřování a mazání
cache souborů pro jednu šablonu použitím identifikátoru šablony při
generování pomocí
fetch() a
display().
Grupování se realizuje buď pomocí operátoru '|' mezi jednotlivými
cache_id, nebo nebo neuvedením názvu šablony, ale pouze cache_id.
Nepoužití názvu šablony a čištení cache jen pomocí cache_id bude
použitelnější, pokud je použito nějaké jméno místo id v databázi.
Příklady na seskupování:
//smazání všech cache souborů s cache_id=='lcd' nebo cache_id=='crt'
$page->clear_cache(null,'lcd|crt');
//smázání cache článků s cache_id=='lcd' nebo cache_id=='crt'
$page->clear_cache('fe_artdetail.tpl','lcd|crt')
Další proměnnou užitečnou pro práci s cache pamětí je
$compile_check,
jenž zajišťuje při každé změně v šabloně, či konfiguračním souboru
šablony (viz další text) bude příslušný soubor v cache znovu
vygenerován. Nastavení této hodnoty na
True
bude použitelné nejvíce při vývoji aplikace, protože v praxi i toto
testování znamená nějakou ztrátu času a mohlo by být značně výkonově
nevýhodné.
Konfigurační soubory
Každý kdo pracuje na větším projektu nebo už má za sebou nějakou praxi
ví, že konfigurace je vhodnější uložit si na jedno místo, do jednoho
souboru, než nastavení (například přístupu do SQL serveru) cyklicky
vypisovat do scriptu, ze kterého tu kterou službu použijete. I Smarty
šablony lze konfigurovat, soubory k tomuto používané jsou samozřejmě
čitelné a zpracovatelné jak na straně Smarty šablony, tak na straně PHP
scriptu, ze které je zobrazení této šablony voláno.
Konfigurační soubory se ukládají do adresáře učeného vlastností
$config_dir třídy
$Smarty.class.php.
Mohou obsahovat konstanty viditelné ve všech scriptech a šablonách,
konstanty viditelné jen z určité šablony a tzv. skryté konstanty a
sekce. Mají doporučenou strukturu, která vypadá například takto:
# Komentář se ukládá za znak #
# Zde jsou definice proměnných dostupných ve všech stránkách
# tzv. globální konfigurační konstanty
pageTitle = "Konfigurace Smarty šablony"
mainColor = #66ccff
alertColor = #ff6666
# skrytá konstanta
.build = 0.0.3
# nastavení pro stránku Novinky
[News]
pageTitle = "Smarty s.r.o. - Novinky"
# nastaveni pro stránku Download
[Dwn]
pageTitle = "Smarty s.r.o. - Stáhněte si"
warn = """Pokud potřebujete v konfiguračním souboru napsat text
přes několik řádek, musíte jej vložit do trojitých
uvoyovek"""
# skrytá sekce
[.hiddenConst]
author = "První webařská a.s."
backdoorpwd = "65aa_7vt"
Struktura souboru je zřejmá. Vše před prvním znakem je dostupné ze
všech šablon, kam je konfigurační soubor vložen. Jednotlivé sekce
začínají názvy sekcí vloženými do hranatých závorek a vše až do názvu
další sekce je přiřazeno k té aktuální. Sekce, nebo konstanty, jejichž
názvy začínají znakem '.' (tečka) jsou považovány za skryté, tj. pokud
není vlastnost
$config_read_hidden nastavena na True, jsou tyto
proměnné v šabloně nedostupné a jsou viditelné pouze ze scriptu, ze
kterého je šablona zobrazena. Konstanty mohou být typů řetězec,
číslo, nebo boolean. Pokud je vlastnost
$config_booleanize nastavena na True, jsou konstanty s hodnotami
true/on/yes a
false/off/no automaticky považovány za typ Boolean s patřičnou hodnotou.
Ke vložení konfiguračního souboru do šablony slouží funkce šablony
{config_load} s následujícími parametry:
- file - Název souboru s konfigurací, povinný parametr
- section - Název sekce, která má být kromě globálních vlastností načtena
- scope - dostupnost načtených proměnných, Možné jsou hodnoty local (konfigurace dostupná jen v šabloně, kde je načtena), both (konfigurace je dostupná v šabloně, ze které je načtena i z šablony, která tuto includuje), global
- global - stejné jako scope='global'
Na straně PHP scriptu má metoda
config_load pouze 2 parametry, jimiž jsou řetězce s názvem souboru, případně nepovinně řetězec s názvem sekce.
Příklady na načtení konfiguračních souborů:
{* Nacteni pouze konfiguacniho souboru, tj. globalnich konstant*}
{config_load file='hlavni.conf'}
{* Nacteni globalnich konstant i s konstantami sekce *}
{config_load file='hlavni.conf' section='news'}
//nacteni konfiguracniho souboru na strane PHP scriptu
$page->config_load('hlavni.conf','news')
Ke vložení konstanty s názvem jmeno_const do šablony slouží sekvence
{#jmeno_const#} na straně šablony, pokud je třeba pracovat s
konstantami na straně PHP scriptu, lze tyto získat do proměnné metodou
get_config_vars(),
kde je možné buď uvést název konstanty, případně jej neuvést, v tom
případě budou konstanty vloženy do pole. Dále je uvedeno několik
příkladů s vložením konstanty jednako na straně šablony a druhako
získání konstant do proměnných na straně PHP scriptu.
{* Zobrazeni konstanty v sablone *}
{# pageTitle #}
//nacteni konstanty do promenne v PHP scriptu
$titulek=$page->get_config_vars('pageTitle');
Pokud je třeba načíst do scriptu i obsah skrytých konstant a sekcí, je
třeba použít trochu složitější postup, který zde bude uveden jen jako
příklad:
<?php
require_once './../smarty/Config_File.class.php';
$conf = new Config_File('./../configs');
// nacteni promenne author z sekce hiddenConst
$author=$conf->get('hlavni.conf", "hiddenConst", "author" );
?>
Jelikož by se zde jednalo o "zbytečné natahování" textu odkáži v tomto případě váženého čtenáře na originální dokumentaci.
Závěrem
V tomto díle jsem se pokusil čtenáři ukázat především urychlení
zobrazování stránek a ulehčení zátěže serveru rozumnou prací s cache a
trochu jsme se podívali na možnosti použití konfiguračních souborů v
návaznosti na Smarty šablony, dovoluji si na okraj poznamenati, že
tento způsob konfigurace nepoužívám.
V příštím díle bude lehký úvod do psaní vlastních pluginů využitelných
ve Smarty šablonách a poté bude několik dílů věnovaných některým
pluginům, které jsem shledal vcelku zajímavými. Celý tento seriál, jak
vzniká je pohledem jednoho člověka, co mohu považovat za zajímavé a
přínosné já, nemusí se líbit jinému, proto uvítám upozornění na další
knihovny, které neznám, ať se s nimi mohu seznámit...