| Rubrika Php / mysql
Pridať komentár
Každý projekt, ktorému sa podarí rozbehnúť, sa časom začne potýkať
s problematikou rýchlosti. Množstvo návštev, množstvo SQL dotazov, veľký
traffic… Problémom s rýchlosťou sa dá vyhnúť vhodne navrhnutým
cachovaním sql dotazov. Napriek tomu, že MySQL databáza ma v sebe
implementované akési cachovanie, reálny výkon je minimálne pochybný. Preto
sa väčšinou využívajú iné metódy. Jednou z nich je cachovať výstup
vygenerovaný PHPčkom priamo do HTML súboru, ktorý potom includujeme namiesto
opätovného vykonania SQL dotazu.
Cachovanie celého výstupu do HTML / TXT súboru používam napríklad
v prípade vygenerovania veľkého stromu kategórií, ktorý je v databáze
uložený klasickým štýlom child_id /parent_id a teda na výber je nutná
rekurzívna funkcia, ktorá je všetko len nie ekonomická. Celý strom si preto
vygenerujem len raz a uložím do HTML súboru, ktorý sa zmaže až pokiaľ
nastane nejaká zmena v týchto kategóriách.
// pokiaľ existuje daný cache súbor, tak ho includneme if(file_exists('cache/nazov_cache_suboru.html')) { include_once 'cache/nazov_cache_suboru.html'; // pokiaľ súbor neexistuje (teda ešte nikto stránku // nenavštívil a cache sa nevygenerovala), nastávaju čary } else { ob_start(); /* Tu príde akýkoľvek kus kódu, ktorý chcem zacachovať.. Rekurívna funkcia, zložitý sql dotaz, čokoľvek... */ $output = ob_get_contents(); ob_end_flush(); $fp = fopen('cache/nazov_cache_suboru.html', 'x'); fwrite($fp, $output); fclose($fp); }
Základom takéhoto cachovania sú funkcie output bufferingu, ktoré
akýkoľvek výstup po zapnutí funkcie pomocou príkazu ob_start()
uložia do bufferu, ktorého obsah je potom možné vložiť do premennej a
zároveň vypísať na obrazovku. Príkazom ob_get_contents()
získame obsah bufferu a vložíme do premennej $output. Funkcia
ob_end_flush() zobrazí obsah bufferu na obrazovku a potom ho
vyprázdni.
Premennú $output, v ktorej je teraz uložený výstup už len zapíšeme do
nejakého cachovacieho súboru, ktorý potom zobrazujeme namiesto opätovného
vykonania SQL dotazu.

naspäť
