Php și cache

intrare

Pentru a optimiza activitatea cu rețeaua, se utilizează un mecanism pentru a salva documentele primite prin HTTP în memoria cache, în scopul reutilizării lor, fără a contacta serverul sursă. Documentele stocate în memoria cache va fi disponibilă data viitoare când este accesat, fără descărcare de pe serverul principal, care este destinat pentru a spori accesul clienților viteza la acestea și de a reduce fluxul de trafic de rețea.







Pentru a cache sau nu?

Abilitatea de a salva în cache-ul paginii este determinată de dinamica informațiilor din sursa de date. Astfel, necesitatea de a utiliza cache-ul este determinată de dvs., pe baza duratei de viață planificate a paginii.

Când vine vorba de selectarea eșantionului pentru baza de date (de exemplu, căutarea de cuvânt introdus de utilizator), atunci această pagină asigurați-vă că pentru a cere de la server la fiecare apel, fără a utiliza un cache, deoarece numărul de cuvinte solicitate pe care doriți este foarte mare, iar dacă avem de a face cu schimbarea o serie de date, atunci cache-ul nu are sens. Sau este vorba de formarea de vizitatori presupun programul vine (care se schimbă cu fiecare vizită, care este, practic, cu fiecare apel), apoi cache-ul este pur și simplu dăunătoare.

Literatura recomandată Andrey Lipatsev: Un număr de pași pentru îmbunătățirea calității site-ului

Cu toate acestea, dacă vorbim despre același grafic, dar ieri, este recomandat cache-ul, deoarece acestea nu vor mai fi schimbat și ne putem și resursele de utilizator și de timp pentru a încărca salva aceste pagini prin plasarea lor într-o memorie cache locală sau partajat. Ca o continuare a acestei situații, formarea programului nu este în timp real, ci pe oră. Aici puteți anticipa în prealabil data de expirare a "datei de expirare" a datelor generate.

Principiile generale de salvare a paginilor în memoria cache

Un program PHP poate controla caching-ul rezultatelor sale prin crearea câmpurilor suplimentare în antetul HTTP al răspunsului apelând funcția Header ().
Mai multe declarații generale sunt caracteristice nu numai pentru programele PHP:

  • Paginile transferate prin POST nu sunt salvate niciodată în memoria cache.
  • Paginile solicitate de GET și conținând parametrii (în URL există un "?") Nu sunt stocate în memoria cache, dacă nu se specifică altceva.

Astfel, în majoritatea situațiilor, nu este necesar să adăugați instrucțiuni suplimentare la program. Principalele puncte pe care trebuie să le acordați atenție pot fi reduse la două:

  • Interzicerea memorării în cache a documentelor stocate în mod implicit în memoria cache
  • cache documente care nu sunt memorate în cache în mod implicit.

Împiedicați memorarea în cache a documentelor memorate în cache în mod implicit

Această problemă apare pentru script PHP se numește fără parametri, sau este directoarele de index, dar generează datele personale în conformitate cu utilizatorul (de exemplu, pe baza cookie-uri sau agent utilizator) sau de lucru, pe baza datelor care se schimbă rapid. Conform specificației HTTP / 1.1, putem gestiona următoarele domenii:

expiră
Specifică data de expirare a documentului. Setarea în trecut determină interzicerea memoriei cache pentru această pagină.







Cache-control: nu-cache
Gestionați cache-ul. Valoarea non-cache specifică faptul că memoria cache a acestei pagini este dezactivată. Pentru versiunea protocolului HTTP / 1.0, "Pragma: no-cache" este validă.

Last-Modified
Data ultimei modificări a conținutului. Câmpul este valabil numai pentru paginile statice. Apache înlocuiește acest câmp cu valoarea câmpului Date pentru paginile generate în mod dinamic, inclusiv pentru paginile care conțin SSI.

Pe site-ul www.php.net este indicat următorul cod pentru interzicerea memorării în cache.

Cu toate acestea, acest antet este redundant. În cele mai multe cazuri, este suficient:

header ("Expiră: Thu, 01 Jan 1970 00:00:01 GMT");

Pentru a marca un document ca "deja depășit", setați câmpul Expirare la data.
antet ("Expiră:" .gmdate ("D, d M YH: i: s") "GMT");

Ei bine, nu trebuie să uităm că și formularele solicitate de POST nu sunt stocate în cache.

Vă recomandăm să citiți "Clustering" - un nou instrument Serpstat

Cachearea documentelor care nu pot fi stocate în cache în mod implicit

O problemă inversă poate părea absurdă la prima vedere. Cu toate acestea, în această situație există o nevoie. În plus față de simpla minimizare a traficului în timpul dezvoltării unui program bazat pe web, trebuie să țineți cont de confortul utilizatorului în lucrul cu acesta. De exemplu, unele pagini ale serverului dvs. se formează pe baza datelor statice de volum mare. Abilitatea de a le include în memoria cache va îmbunătăți în mod semnificativ viteza serverului pentru utilizator și vă va elibera parțial de numeroasele generații repetate ale unei astfel de pagini. Titlu care permite salvarea pe servere proxy:

Caching înainte de expirarea corectitudinii

Soluțiile descrise mai sus sunt destul de simple, deși sunt potrivite pentru majoritatea problemelor. Dar protocolul HTTP / 1.1 are mijloacele de a ajusta memoria cache a paginilor și există sarcini care necesită utilizarea acestor mecanisme. Ca exemplu - aplicații web care funcționează cu date de volum mare și dinamism previzibil. Corectitudinea datelor poate fi stabilită atât de data actualizării prognozate, cât și de modificarea conținutului. În aceste cazuri, sunt utilizate anteturi de gestionare a cache-urilor diferite.

Caching cu o actualizare previzibilă

$ dt_tmp = getdate (data ("U"));
header ( "Expira:" gmdate ( "D, d M Y H: i: s", data ( "U") - (86.400 * ($ dt_tmp [ "wday"] - 8))) "GMT".);
header ("Cache-control: public");

O altă abordare utilizată la informații mai mari de actualizare operaționale și de trafic simultan de mare de server (în caz contrar cache nu ar fi eficientă) este de a utiliza antetul Cache-Control: max-age = secunde, determină timpul după care documentul este considerat învechit și are o prioritate mai mare la calcularea " prospețime "a documentului.

Lectură recomandată Cel mai urgent în marketingul de căutare

Dacă publicați știri cu un interval de 30 de minute:

header ("Cache-control: public");
antet ("Cache-control: max-age = 1800");

Caching prin conținut

Să luăm în considerare un exemplu de ieșire de imagine dintr-o bază de date identificată prin ID. Apelul de pagină arată astfel:

ceea ce înseamnă că prin reguli pagina nu va fi stocată în memoria cache (există parametri), dar o puteți gestiona prin antet.

mysql_connect ("gazdă", "utilizator", "passwd");
$ image = mysql ("db", "selectați pics, tip din imagini unde id = $ id");
Header ("Cache-Control: public, must-revalidate");
Antet ("Vary: Content-ID");
Antet ("Content-ID:" .md5 (mysql_result ($ image, 0, "pics"))));
Antet ("Tip de conținut:" .mysql_result ($ image, 0, "type"));
echo mysql_result ($ imagine, 0, "pics");
mysql_freeResult ($ imagine);
mysql_close ();

Note pentru Apache rusesc

Și un mesaj plăcut (sau neplăcut) pentru utilizatorii Apache rusesc. Deoarece serverul emite cod vechi folosind codificarea personalizată, acesta furnizează automat toate paginile (nu numai cele dinamice) cu anteturi care interzic cache-ul.

Expiră: Joi, 01 Jan 1970 00:00:01 GMT

Deci, toate paginile nu sunt memorate în cache. Formarea în antetul scriptului Exprese nu are efect. De ce se face acest lucru și câteva metode de luptă sunt descrise în apache.lexa.ru și nu este nevoie să reproduceți aceste sfaturi aici. Având în vedere lucrul de PHP + Apache rusesc este modul în care puteți afecta caching-ul.
Pentru scripturile care afișează imagini, situația este simplă - Apache-ul rusesc nu recodează (deci nu stabilește data de expirare) cu imaginea de tip MIME / *. Pentru a utiliza cache-ul de documente text, ar trebui să utilizați probabil "Cache-control: private, max-age =" pentru a permite cache-ul paginilor din browser. Deși aceasta este o ipoteză teoretică, nu este testată în practică.







Trimiteți-le prietenilor: