Jednou se zákonitě musí stát, že čas, který spotřebovává vaše webová aplikace na serveru, začne dosahovat nepříjemných čísel. A shodou okolností se zrovna na tomhle webu začnou houfně objevovat návštěvníci. Zátěž serveru se zvětšuje, barva pleti vašeho hostera se mění ze spokojené růžové na temně fialovou a vám nezbývá než se pustit do optimalizace. Jak tedy ulevit serveru, těžce zkoušenému přívalem návštěvníků? Ano, je tady cache. Tentokrát se nejedná se o onu známou a nezkušenými webmajstry proklínanou prohlížečovou kešku, ale o server-side kešování systémově náročných segmentů stránky. Za vše nechť raději promluví příklad:

  1. <?php
  2. define ('CACHEDIR','cache/');
  3.  
  4. function ulozCache ( $content ,  $cacheName ) {
  5.   $fp = fopen(CACHEDIR. urlencode($cacheName).'.dat' , 'w' );
  6.   fwrite( $fp , $content );
  7.   fclose( $fp);
  8. }
  9.  
  10. function ctiCache ( $cacheName ,  $expireTime ) {
  11.   $cacheFile= CACHEDIR.urlencode($cacheName).'.dat';  
  12.   if ( file_exists ($cacheFile ) && filemtime ( $cacheFile ) >( time() $expireTime ) ) {
  13.     return file_get_contents( $cacheFile );
  14.   }
  15.   return false;
  16. }
  17. ?>
  18.  
  19. <html>
  20. <?php
  21. if ( !$cachedText = ctiCache( 'narocnyBlok' , 600 )) {
  22.       ob_start();
  23.       // kešovaná oblast
  24.       ?>
  25.      
  26.       <p>Zobrazen soubor ulozeny v <? echo date("H:i:s"); ?>.</p>
  27.      
  28.       <?php
  29.       //konec kešované oblasti
  30.       $cachedText = ob_get_contents();
  31.       ob_clean();
  32.       ulozCache( $cachedText , 'narocnyBlok' );
  33. }
  34. echo $cachedText;
  35. unset ($cachedText);
  36. ?>
  37. </body>
  38. </html>

Hned v úvodu si vytvoříme dvě důležité funkce. První ulozCache() je taková jednodušší. Pouze zapíše data do souboru se zadaným označením. Druhá z klíčových funkcí ctiCache() se nejprve pokusí zjistit, zda soubor s určeným označením existuje. Pokud ano, podle stáří souboru vrátí obsah souboru. V případě že je soubor příliš starý (porovná čas vytvoření s aktuálním časem minus povolené stáří souboru), tváří se, že neexistuje.

V hlavním těle programu možná kromě jednoduché podmínky, která se vlastně stará o veškerou funkcionalitu, padnou neznalému do oka funkce ob_start, ob_get_contents a ob_clean (můžete je nahradit ob_get_clean). Jedná se o sadu funkcí, díky kterým umí náš skript zachytit a přesměrovat běžný výstup z aplikace do proměnné, odkud jej pak můžeme sami poslat na výstup nebo uložit do souboru.

Kešování v těle skriptu funguje nejprve tak, že se pokusí získat obsah souboru označený nálepkou ‘narocnyBlok’. Pokud soubor existuje, uložíme si jej do proměnné. V opačném případě spustíme output buffering (ob_start), provedeme onen systémově náročný skript v podmínce a výsledek si uložíme do souboru pro pozdější použití.

V obou případech máme na konci bloku v proměnné “cachedText” obsah, který můžeme poslat na výstup.

Hlasujte pro tento článek:
  • Bookmarky.cz
  • Digg
  • del.icio.us
  • Google
  • Linkuj
  • Vybrali.sme
  • E-mail this story to a friend!
  • Facebook
  • LinkedIn

Komentáře

Váš komentář: