Laikinoji atmintinė su PHP

Ši svetainė šiuo metu yra generuojama visiškai dinamiškai, t.y. užduodama krūva SQL klausimų, paimamas šablonas ir pagal jį sukonstruojamas puslapis. Visa tai labai gerai, kai lankytojų skaičius nedidelis (o lankytojų skaičius čia nėra didelis – apie 100-150 unikalių lankytojų per parą. Tad sumąsčiau, kad reikėtų pasidaryti šiokią tokią laikinosios atmintinės (kešavimo) sistemą, ir bent jau RSS naujienų negeneruoti dinamiškai. Kol kas to nereikia ta prasme, kad serveris puikiai dar viską paveža (nors tą serverį sunkiai apsiverčia liežuvis serveriu vadint – mano skaičiavimo mašinėlė turbūt greitesnė yra), tačiau kaip visada šioje svetainėje viską darau tik eksperimentuodamas ;)

Kaip tik radau aprašymą kaip Simon Willison išspręndė laikinosios atminties problemą su labai paprastu PHP skriptu. Štai visas šis kodas:

<?php
$cachefile = 'cache/index-cached.html';
$cachetime = 5 * 60;
// Jei atmintyje esantis puslapis yra jaunesnis nei $cachetime, tai pateikiame jį iš atminties
if (file_exists($cachefile) && time() - $cachetime < filemtime($cachefile)) {
    include($cachefile);
    echo "<!-- Kopija iš atminties, sugeneruota ".date('H:i', filemtime($cachefile))." -->\n";
    exit;
}
ob_start(); // Įjungiame išvedimo buferį

/* Čia įdedame kodą, kuris generuoja dinaminį puslapį */

// Įrašome visa tai kas sukaupta buferyje į atmintį (į bylą)
$fp = fopen($cachefile, 'w');
fwrite($fp, ob_get_contents());
fclose($fp);
ob_end_flush(); // Siunčiame išvedimo buferį naršyklei
?>

3 Comments

  1. Jo gana paprastas sprendimas.Man buvo mintis uzvirus irgi kazka idomaus padaryt dar efektyvesnio ta pasme kad cashe'avima atlikti ne php lygyje o statiskai pageneruot failiukus ir leisti cashe'uoti servui, proxiams…aisq padaryt vienkartiniam projektui tai paprasta, bet universalu varikliuka pakurt reiktu gal net biski pagalvot ir nemazai paexperimentuot :)

  2. to: congo,

    sudėtingiausia tavo sprendime būtų įgyvendint tokias vietas kur tikrai reikia dinamikos (pvz.: loginas, ar sugeneruotas privačių žinučių kiekis), taip išeina kad reikia kešuot tam tikras puslapio vietas, o kai kešavimas nesusijęs sus sistema …. emmm… kas tada ? nekešuot tokio puslapio iš vis ? o jei loginas visuose svetainės vietuose ? nekešuot svetainės ?

    tad jei daryt kešavima php projektuose tai reik ir daryt su php.

    velnias žino, gal yra ir kitų būdų tokias problemas apeit …

Comments are closed.