Opracowalem kiedys dla wlasnych potrzeb klase "Cache", ktora wspolpracuje z "TplParser" (umiescilem skrypt do niego w dziale
skrypty php).
Kod Html na podstawie template'ow wciskany jest do jednej zmiennej i na koncu pliku wyswietlany np. echo $sContent;
Do pliku np. "cache.txt" laduje wszystkie REQUEST_URI oraz sciezke do cache'owanego pliku, ktory ma sie wyswietlic jesli zostal wykonany jakis kod HTML.
W ten sposob cache generuje sie na zywo. Ktos wyszukuje to wpierw wygeneruje na bazie odpowiednie zapytanie i zostanie mu wyswietlony wynik a miedzyczasie zapisuja sie do odpowiedniego pliku dane.
Jesli ponownie ktos wykona podobne wyszukiwanie to zamiast powtornie obciazac baze to po prostu pobierany jest wygenerowany plik z kodem HTML.
Oczywiscie trzeba opracowac tez kilka wyjatkow bo co jak ktos przesyla formularz POST'em itd itp. Obeszlem to tak, ze po prostu do tablicy spisuje jakie akcje maja sie nie cache'owac i tyle.
Dzieki cache'owaniu doszlo do tego, ze czasami nie musimy sie wogole laczyc z baza danych a kod jest 10 x szybciej generowany.
Problem tez pojawil sie w przypadku gdy niektore czesci kodu maja sie generowac dynamicznie np. bannery, losowy artykul itd.
Obeszlismy to tak iz do wygenerowanych plikow HTML wciskalismy po prostu zmienne i w czasie wyswietlania parsowalismy odpowiednio plik, ktory pozniej zamienial zmienne kod.
Przykladow wykonana akcja "index.php?p=productsList":
<?php
// definiowanie co ma sie nie generowac w cache
$oCache->setExceptions( Array( 'productsShow', 'productsForm' ) );
// zwracanie losowego bannera
$sBanner = throwRandomBanner( );
// sprawdzanie czy istnieje cache'owany plik
if( $oCache->checkCache( $_GET['p'] ) === TRUE ){
echo $tpl->dHtml( $oCache->throwFile( $_GET['p'] ) ); }
else{
/*
* To tutaj laczymy sie z baza, wyswietlamy dane z bazy itd
*/
$content = $tpl->tHtml( 'page.tpl' );
// sprawdzanie czy wykonana akcja np. $_GET['p'] czy $_SERVER['REQUEST_URI'] jest w wyjatkach
if( $oCache->checkException( $_GET['p'] ) === FALSE ){
// cache'owanie
$oCache->cacheHtml( $content, $_GET['p'] );
}
}
?>
Oczywiscie to tylko przyklad jak cos rozwiazac. Niekoniecznie to tak wyglada u mnie gdyz pisalem to nie patrzac wogole do kodu konkretnej realizacji takiego projektu.
Jesli wykonamy jakas akcje zapisu/zmiany w bazie to wystarczy jedynie usunac cala zawartosc lub czesc pliku cache.txt i wszystko bedzie generowane od poczatku
Musze dodac iz jest to rozwiazanie dla konkretnych przypadkow nie wszedzie sie sprawdzi. Wychodzilismy z zalozenia, ze wazne jest proste rozwiazanie zakladajac, ze wszystko co sprawi iz cos bedzie mniej obciazalo serwer jest "dobre".