PHP knihovny - Smarty VI.

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:
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:
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:
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:
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...
Online verze článku: http://www.linuxsoft.cz/article.php?id_article=813