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:
-
<?
-
class MyCache {
-
/* sem sa budú ukladať cache súbory */
-
public static $CacheDir = './cache/';
-
-
/*
-
funkcia GetCache() zobrazí nacachovanú stránku a vráti true, alebo zapne
-
output buffering ak cache stránky neexistuje a vráti false
-
*/
-
public static function GetCache() {
-
$f = MyCache::$CacheDir . str_replace('/', 'x', $_SERVER["REQUEST_URI"]);
-
if(is_readable($f)) {
-
$MTime = filemtime($f);
-
if(time() - $MTime < 604800) {
-
readfile($f);
-
return true;
-
}
-
}
-
ob_start();
-
return false;
-
}
-
-
/* funkcia StopCache() vypne output buffering a uloží cache stránky do súboru */
-
public static function StopCache() {
-
$output = ob_get_contents();
-
$f = MyCache::$CacheDir . str_replace('/', 'x', $_SERVER["REQUEST_URI"]);
-
if(!file_exists($f) || is_writable($f)) {
-
$fh = fopen($f, 'w');
-
fwrite($fh, $output);
-
fclose($fh);
-
}
-
}
-
}
-
?>
A použitie v PHP kóde danej stránky je nasledovné:
-
<?
-
include('MyCache.class.php');
-
/* ak cache existuje tak sa zobrazí a skript sa ukončí */
-
if(MyCache::GetCache()) {
-
exit();
-
}
-
-
/*
-
Tu je všetok kód potrebný na vygenerovanie stránky.
-
*/
-
-
MyCache::StopCache();
-
?>
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.
Spätné upozornenie: Cachovanie dátových štruktúr v PHP | Hlava bloguje