Server-side cache v PHP
Odesláno v July 3, 2008 | Kategorie Internetové aplikace, PHP, Programování, webdesign | Leave a Comment
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:
-
<?php
-
define ('CACHEDIR','cache/');
-
-
function ulozCache ( $content , $cacheName ) {
-
$fp = fopen(CACHEDIR. urlencode($cacheName).'.dat' , 'w' );
-
fwrite( $fp , $content );
-
fclose( $fp);
-
}
-
-
function ctiCache ( $cacheName , $expireTime ) {
-
$cacheFile= CACHEDIR.urlencode($cacheName).'.dat';
-
if ( file_exists ($cacheFile ) && filemtime ( $cacheFile ) >( time() - $expireTime ) ) {
-
return file_get_contents( $cacheFile );
-
}
-
return false;
-
}
-
?>
-
-
<html>
-
<?php
-
if ( !$cachedText = ctiCache( 'narocnyBlok' , 600 )) {
-
ob_start();
-
// kešovaná oblast
-
?>
-
-
<p>Zobrazen soubor ulozeny v <? echo date("H:i:s"); ?>.</p>
-
-
<?php
-
//konec kešované oblasti
-
$cachedText = ob_get_contents();
-
ob_clean();
-
ulozCache( $cachedText , 'narocnyBlok' );
-
}
-
echo $cachedText;
-
unset ($cachedText);
-
?>
-
</body>
-
</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.
Komentáře
Váš komentář:








