Sfat pentru viteza – Caching pentru continut dinamic

Si fisierele generate dinamic pot beneficia de caching. De exemplu, aveti o baza de date cu 5000 de produse, dintre care numai pentru unele din ele s-a modificat pretul sau descrierea. Desi paginile de vizualizare a acestor produse extrag in mod dinamic informatii din baza de date, la randul lor pot fi determinate sa foloseasca cache-ul broserului, prin utilizarea headerului Last-Modified. Functia PHP de mai jos va transmite browserului headerele adecvate, in baza datelor calendaristice folosite.

Practic, ea compara data If-Modified-Since transmisa de browser cu data modificarii. Daca produsul a fost modificat de la If-Modified-Since, intreaga pagina este returnata cu header Last-Modified. Daca nu, serverul retuneaza raspunsul 304, cu headerul Not Modified, ceea ce determina browserul sa foloseasca versiunea din cache a fisierului.

Function CacheHeaders ($modtime){

if (is_string ($modtime)) {

$modtime = strtotime ($modtime); //

daca este transmis ca sir de caractere

$reqheaders = apache_request_

headers(); // extrage headerele cererii

$reqtime = isset ($reqheaders[“If-Modified-Since”]) strtotime

($reqheaders[“If-Modified-Since”] : 0;

header (“Expires:Mon, 11 July 2011 00:00:00 GMT”); //stabileste data de expirare a paginii candva in trecut

header (“Cache-Control: private, mustrevalidate”); //poate fi stocat in cache, necesita revalidare obligatorie

header (“Pragma: cache”)’

//suprascrie, pentru siguranta, directiva prgma:no-cache

}

if ($reqtime < $modtime)

header(“Last-Modified: “.gmdate(“D,d m y H:i:s T”, $modtime));

else {

header (“HTTP/1.0 304 Not Modified”);

exit;

}

}

Script-ul transmite o data de expirare in trecut pentru a se asigura ca browserul se bazeaza pe data ultimei modificari si nu incearca cachingul prea entuziast (spre deosebire de resursele statice, unde data expirarii este stabilita in viitor pentru a incuraja cachingul). Presupunand ca aveti un $product cu un camp cu data ultimei modificari, functia ar putea fi folosita asa:

CacheHeaders ($product → lastmodified);

Sau daca pagina de index se schimba frecvent, puteti cere browserului pur si simplu sa stocheze in cache pagina cate 10 minute. Un utilizator care se reintoarce pe pagina pentru a urmari alte elemente ale ei va beneficia de o experienta mai dinamica. Caracterul % este operatorul modulo: el asigura ca perioada modificata este rotunjita la ultimele 600 de secunde.

$now = time();

CacheHeaders ($now – ($now % 600));

In Firefox, puteti da click dreapta pe pagina si alege optiunea View page info pentru a verifica daca Last Modified Date este configurata corect. Si, intotdeauna, puteti apsa Shift+Refresh/Reload pentru a forta browserul sa afiseze cea mai recenta versiune a paginii.

Leave a reply

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>