Add to Google Reader or Homepage Prihlásiť sa k odberu RSS

| Rubrika Php / mysql

Diskusia k článku

Cachovanie do HTML súboruZobraziť článok

Žiadne komentáre.

Naspäť naspäť

Pridať komentár

Koľko je na ruke prstov?

Náhľad článku

Cachovanie do HTML súboru

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.

RSS