Jednoduché cachování v PHP

Máte webové stránky se spoustou PHP kódu, ale jejich obsah se mění pouze jednou za čas? Pak právě Vám přinášíme článek o jednoduchém cacheování v PHP pomocí Output Bufferu.

O co se vlastně jedná?

Použitím cacheování pomocí OB docílíte toho, že každé stránce webu vytvoříte její html kopii, která se bude načítat místo zpracováváni stovek řádků kódu. Při načtení jednoduše nahlédneme do cache, pokud zde bude požadovaná stránka a zobrazíme ji. V opačném případě stránku načteme normálně a na konci ji uložíme.

  1. <?php
  2. ob_start(); // spustíme OB
  3. // zde umístěte jakýkoli HTML a PHP kód
  4. // "uvod" nahraďte nejlépe nějakým PHP kódem, který bude pojmenovávat aktuální stránky
  5. // např. pokud máte web example.cz/index.php?page=uvod, řádek by byl $filename = $_GET["page"];
  6. // to nám zajistí originální název pro každou cacheovanou stránku
  7. $filename = "uvod";
  8. $cachefile = "cache/$filename.html";
  9. // otevřeme soubor
  10. $fp = fopen($cachefile, 'w');
  11. // a uložíme do něj obsah bufferu
  12. fwrite($fp, ob_get_contents());
  13. // zavřeme
  14. fclose($fp);
  15. // a nakonec odešleme obsah bufferu ještě návštěvníkovi webu
  16. ob_end_flush();
  17. ?>

Z cache ven!

Web máme nacacheován… ale co teď? Následující kód slouží k načtení html kopie:

  1. <?php
  2. // filename viz výše
  3. $filename = "uvod";
  4. $cachefile = "cache/$filename.html";
  5. // v případě, že soubor existuje, includujeme ho a ukončíme běh scriptu
  6. if (file_exists($cachefile)) {
  7. include($cachefile);
  8. exit;
  9. }
  10. ?>

A kdy se mi cache pročistí?

Pročištění se dá udělat několika způsoby – buď při každé změně složku cache pročistíte, nebo si vypomůžete přímo ve vašem kódu. :) Další způsob je, žeporovnáte stáří souboru s nejnovějšími daty z databáze a nebo jednoduše nastavíte automatickou expiraci. Tu si ukážeme.

  1. <?php
  2. // 60 (minuta) * 60 hodina * 24 (den) = nastavíme platnost cache na 1 den, po té se html soubor vygeneruje znova
  3. $cachetime = 24 * 60 * 60;
  4. // pokud je soubor mladší než stanoví proměnná $cachetime, načteme z cache
  5. if (file_exists($cachefile) AND (time() - $cachetime < filemtime($cachefile))) {
  6. include($cachefile);
  7. exit;
  8. }
  9. ?>