Na osnovu toga što si opisao, tj. zahteva kojeg imaš, ja bih se tu pre odlučio za keširanje celih output-a tih stranica sajta, a ne samo rezultata upita zaduženih za dohvatanje podataka o nekom artiklu. Jer meni ta priča - 100 stranica na kojima se prikazuje po jedan artikal, plus činjenica da će se oni ažurirati najviše jednom godišnje, više vuče na neki statički sajt.
Tako da, tu je definitivno bolje i efikasnije ići sa keširanjem cele stranice, kako bi se izbegao overhead prolaska kroz PHP, ili kako bi taj prolazak trajao što kraće. Naravno, u obzir dolazi i varijanta sa keširanjem na dva nivoa, dakle keširanje rezultata SQL upita, plus keširanje cele stranice.
Što se implementacije tiče, to bi recimo išlo ovako nekako...
Cela stvar bi se u velikoj meri oslanjala na PHP-ovu
Output Control funkcionalnost, tačnije na
ob_start() funkciju. Ideja je da ta page keš implementacija bude negde "visoko" u tvom kôdu, kako bi učinak bio što bolji, u smislu da se keširani ispis što pre vrati korisniku. Sve to bi izgledao ovako nekako:
Code:
//Funkcije za dohvatanje/čuvanje keša
$cacheFolder = '/putanja/do/cache/foldera';
function loadPage($id) {
$filePath = $cacheFolder . '/' . $id . '.html';
if (is_file($filePath)) {
return file_get_contents($filePath);
}
return false;
}
function savePage($id, $content) {
$filePath = $cacheFolder . '/' . $id . '.html';
file_put_contents($filePath, $content);
}
$id = $_SERVER['REQUEST_URI']; //URI trenutne stranice
if (($output = loadPage($id)) !== false) { //Stranica je keširana? Ispiši je...
header('Content-type: text/html');
echo $data;
die();
}
//... u suprotnom, započni buffer-ovanje output-a
ob_start('_flush');
ob_implicit_flush(false);
//Callback nakon kompetiranja buffer-ovanja.
function _flush($output) {
savePage($id, $output);
}
//... ovde bi išao tvoj kôd...
Čisto sumnjam da ovaj kôd radi,

napisao sam ga na brzinu, iz glave, ali poenta je bila da ti dam ideju. Dakle imao bi neku logiku koja rešava pitanje keširanja - load/savePage() funkcije, i zatim taj deo sa "hvatanjem" output-a - ob_start(). I kao što vidiš, za taj neki id keš unosa bi se uzimao URI trenutne stranice.
Priča sad može i da se "zakomplikuje", tako što bi npr. još više mogao da ubrzaš stvar, na način da u
.htaccess dodaš ovako nešto:
Code:
RewriteCond %{DOCUMENT_ROOT}/putanja/do/cache/foldera/index.html -f
RewriteRule ^/*$ putanja/do/cache/foldera/index.html [L]
RewriteCond %{DOCUMENT_ROOT}/putanja/do/cache/foldera/%{REQUEST_URI}.html -f
RewriteRule .* putanja/do/cache/foldera/%{REQUEST_URI}.html [L]
To u prevodu znači da bi se serviranje tih ukeširanih stranica radilo direktno, bez ulaska u PHP, što za rezultat ima ultra-performantno rešenje.
E sad, kao što sam već pomenuo, ovo moje rešenje ne bi trebao da shvataš toliko ozbiljno, u smislu da sad bukvalno kopiraš i pokušaš da iskoristiš taj snippet odozgo. To što sam ja napisao nije ništa novo, i već postoje gotova i mnogo kompletnija rešenja koja rade na tom principu, kao što je npr.
Zend_Cache_Frontend_Page. Tako da, ja ti toplo preporučujem da integrišeš Zend_Cache na tvom sajtu.