Cachovanie stránok v PHP

Asi niekedy začiatkom tohto roku som kompletne prekódoval moju homepage. Znovu som použil PHP framework Qcodo, avšak novšiu a robustnejšiu verziu a ako som zistil až keď bol web nahraný na server, tak len samotná inicializácia frameworku trvala 0,3 sekundy. Niet sa čomu čudovať, je to starý kamarátov server s 430 MHz CPU.

Aj vďaka tomu, že len inicializácia frameworku zaberala 0,3 sekundy vygenerovanie niektorých stránok trvalo až 0,7 sekúnd, čo je celkom otravné a tak som sa rozhodol vyriešiť to. Ako najreálnejšia možnosť mi prišlo cachovanie vygenerovaných stránok, ešte pred inicializáciou Qcodo frameworku.

Z webu som vyhodil zobrazovanie času za aký bola stránka vygenerovaná, pretože s cachovaním by to nemalo zmysel a napísal som si triedu pre cachovanie.

MyCache.class.php:

  1. <?
  2. class MyCache {
  3.         /* sem sa budú ukladať cache súbory */
  4.         public static $CacheDir = './cache/';
  5.  
  6.         /*
  7.         funkcia GetCache() zobrazí nacachovanú stránku a vráti true, alebo zapne
  8.         output buffering ak cache stránky neexistuje a vráti false
  9.         */
  10.         public static function GetCache() {
  11.                 $f = MyCache::$CacheDir . str_replace('/', 'x', $_SERVER["REQUEST_URI"]);
  12.                 if(is_readable($f)) {
  13.                         $MTime = filemtime($f);
  14.                         if(time() - $MTime < 604800) {
  15.                                 readfile($f);
  16.                                 return true;
  17.                         }
  18.                 }
  19.                 ob_start();
  20.                 return false;
  21.         }
  22.  
  23.         /* funkcia StopCache() vypne output buffering a uloží cache stránky do súboru */
  24.         public static function StopCache() {
  25.                 $output = ob_get_contents();
  26.                 $f = MyCache::$CacheDir . str_replace('/', 'x', $_SERVER["REQUEST_URI"]);
  27.                 if(!file_exists($f) || is_writable($f)) {
  28.                         $fh =  fopen($f, 'w');
  29.                         fwrite($fh, $output);
  30.                         fclose($fh);
  31.                 }
  32.         }
  33. }
  34. ?>

A použitie v PHP kóde danej stránky je nasledovné:

  1. <?
  2. include('MyCache.class.php');
  3. /* ak cache existuje tak sa zobrazí a skript sa ukončí */
  4. if(MyCache::GetCache()) {
  5.         exit();
  6. }
  7.  
  8. /*
  9. Tu je všetok kód potrebný na vygenerovanie stránky.
  10. */
  11.  
  12. MyCache::StopCache();
  13. ?>

Ako vidíte, tak použitie triedy MyCache je veľmi jednoduché. Trieda sa sama stará o to kam sa súbor uloží a názov cache súboru sa generuje automaticky z URI stránky. Trieda nemá ošetrené zmeny stránok a o toto sa treba postarať manuálne. Napríklad pri pridávaní novinky, alebo príspevku do boardu sa o vymazanie cache stará skript pracujúci s novinkami/príspevkami.

Tento spôsob cachovania je vhodný len pre stránky s takmer statickým obsahom, presne ako je moja homepage a slúži len na cachovanie celých stránok. V mojom prípade sa rýchlosť načítania zmenila z 0,7 sekúnd na okamžite ;). Ak by ste chceli cachovať len časti stránok, tak si môžete triedu upraviť, alebo si prečítajte článok o cachovaní do súboru na phpblog.sk.

Súvisiace články:

1 komentár pri “Cachovanie stránok v PHP

  1. Spätné upozornenie: Cachovanie dátových štruktúr v PHP | Hlava bloguje

Pridaj komentár

Vaša e-mailová adresa nebude zverejnená. Vyžadované polia sú označené *

*

Môžete použiť tieto HTML značky a atribúty: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>