Ce sunt API-urile tranzitorii?
Publicat: 2020-12-16Performanța site-ului web se învârte adesea în jurul ideii de stocare în cache: stocarea datelor într-o stare gata și de acces mai rapid, astfel încât acestea să fie reproduse mai rapid de browsere. API-ul WordPress Transients este un instrument pentru stocarea în cache și un mod puternic de a îmbunătăți performanța pentru site-urile web WordPress.
Ce este stocarea în cache și de ce se folosește?
Ori de câte ori un browser solicită o pagină web, serverul de servire trebuie să facă o mulțime de calcule complexe și care necesită mult timp, ceea ce duce la întârzieri. După executarea unei interogări, datorită tehnologiei de stocare în cache, serverul își poate aminti rezultatul final și, la o a doua cerere, îl poate furniza browserului fără a fi nevoie să facă din nou aceleași calcule. Prin urmare, capacitatea de a memora în cache și de a reutiliza resursele anterioare este crucială pentru optimizarea performanței.
Pur și simplu cache-ul oferă opțiunea de a stoca informații temporar în stratul cache.
Care sunt tipurile de cache?
Există diferite tipuri de stocare în cache și, utilizând o combinație a acestora, veți obține un nivel mai ridicat de performanță.
Memorarea în cache a browserului
Înainte de a deschide conținutul unei pagini web, browserul dvs. are nevoie de o mulțime de lucruri, cum ar fi fișiere JavaScript, foi de stil, fonturi și altele, pe care le descarcă pe lângă conținutul paginii.
Dacă un browser cache aceste fișiere, nu va fi nevoie să le descărcați de fiecare dată când încărcați site-ul web. Încărcarea site-ului pentru prima dată durează de obicei câteva secunde, dar după ce browserul cache aceste fișiere, timpul de încărcare este redus semnificativ.
Memorarea în cache a serverului
Memorarea în cache a serverului înseamnă să salvați fișierul HTML pentru o anumită pagină și să utilizați dacă pentru fiecare cerere ulterioară. Acesta este așa-numitul cache de pagină completă.
Există un alt tip de cache de server - cache de obiect, care, spre deosebire de cache de pagină completă, cache doar anumite biți (bucăți) de informații.
Memorarea în cache a paginilor
Considerat cel mai eficient cache. Numele său se explică de la sine pentru modul în care funcționează. Când utilizatorul „A” vizitează o pagină, site-ul web o va construi și va returna conținutul în browserul utilizatorului. Când pagina Cache rulează, acest conținut al paginii este salvat astfel încât atunci când utilizatorul „B” vizitează aceeași pagină, memoria cache a paginii reproduce conținutul trimis anterior.
Cel mai mare avantaj al Page Cache este că pagina cache se întoarce aproape în momentul accesului. Drept urmare, milioane de solicitări sunt procesate și pagini reproduse chiar și pe cel mai slab server cu cea mai mică viteză de memorie și o utilizare redusă a procesorului.
Dar acest tip de cache are și dezavantajele sale: de exemplu, incapacitatea de a cache pagini pentru un utilizator autorizat sau pentru un utilizator al cărui conținut de pagină depinde de variabilele curente ale utilizatorului.
Memorarea în cache a bazei de date
Memorarea în cache a bazelor de date este un proces inclus în proiectarea aplicațiilor informatice care generează pagini web la cerere (dinamic) prin accesarea bazelor de date backend. O memorie cache de baze de date îmbunătățește baza de date principală prin eliminarea presiunii inutile asupra acesteia, de obicei sub formă de date citite frecvent. Cache-ul în sine poate funcționa în mai multe domenii, inclusiv baza de date, aplicația dvs. sau ca strat independent.
Atunci când aceste aplicații sunt implementate în medii cu mai multe niveluri care implică clienți bazate pe browser, servere de aplicații web și baze de date backend, stocarea în cache a bazelor de date de nivel mediu este utilizată pentru a obține o scalabilitate și performanță ridicate.
Cache de obiecte
Memorarea în cache a obiectelor în WordPress (cache obiect) implică stocarea interogărilor bazei de date. Este un mecanism de sistem încorporat care vă permite să salvați date (obiecte) de orice tip și să le preluați atunci când este necesar. Această memorie cache este utilizată pentru a stoca rezultatele operațiilor complexe.
Când este activat pe site-ul dvs. WordPress, acesta ajută la accelerarea timpilor de execuție PHP, la livrarea de conținut vizitatorilor site-ului mai repede și la reducerea încărcării bazei de date.
CDN (rețele de livrare de conținut)
Este o infrastructură de rețea distribuită geografic, care asigură livrarea rapidă a conținutului către utilizatorii de servicii și site-uri web. Serverele incluse în CDN sunt localizate geografic în așa fel încât să facă timpul de răspuns pentru utilizatorii site-ului / serviciului minim.
Ce este un API tranzitorii în WordPress?
API tranzitorii este modalitatea de stocare a unui bloc de informații (un șir de cod, conținut HTML, obiecte WP_Query, JSON) în baza de date a site-ului web, spre deosebire de cache-ul browserului. API-ul Transients este foarte similar cu API-ul Options, dar principala diferență este că API-ul Transients are un timp de expirare sau o durată de viață mai bună.
Cele trei operații principale pentru tranzitorii sunt setarea valorilor, obținerea valorilor și ștergerea valorilor :
1. Setați un tranzitoriu -
set_transient ($ cheie, $ valoare, $ expiră);
Pentru a seta un tranzitor, puteți utiliza funcția set_transient () care are trei componente:
- Tastă - Numele scurt scurt al tranzitorului. Trebuie să aibă 172 de caractere sau mai puțin în lungime.
- Valoare - Orice tip de variabilă PHP care conține informațiile care vor fi stocate în baza de date.
- Timp de expirare (durata de viață) - perioada de timp pentru care informațiile vor fi stocate.
Deci, de exemplu, dacă vrem să salvăm interogarea listărilor noastre de listare pentru o zi:
set_transient ('unique_listing_posts_query_results_name'),$ listing_posts_query_results, DAY_IN_SECONDS);
După cum puteți vedea, am folosit una (DAY_IN_SECONDS) din mai multe constante de timp introduse în WordPress 3.5 pentru a exprima cu ușurință timpul. Iată o listă completă a constantelor din toate timpurile:
MINUTE_IN_SECONDS = 60 (secunde) HOUR_IN_SECONDS = 60 * MINUTE_IN_SECONDS DAY_IN_SECONDS = 24 * HOUR_IN_SECONDS WEEK_IN_SECONDS = 7 * DAY_IN_SECONDS MONTH_IN_SECONDS = 30 * DAY_IN_SECONDS YEAR_IN_SECONDS = 365 * DAY_IN_SECONDS
2. Obțineți un tranzitoriu -
get_transient ($ cheie);
Pentru a obține un tranzitoriu salvat îl putem folosi
get_transient ($ transient_name);
În cazul nostru, am putea prelua postările noastre care afișează rezultatele interogării cu:
get_transient ( 'unique_listing_posts_query_results_name' );
Vom vedea mai multe despre asta mai târziu în secțiunea noastră de exemplu.
3. Ștergeți un tranzitoriu -
delete_transient ($ cheie);
După cum am explicat în subsecțiunile anterioare, putem utiliza API-ul Transients pentru a obține și stoca răspunsuri la distanță sau locale (conținut sau interogare din baza noastră de date) la baza noastră de date.
Cu toate acestea, aici apare întrebarea cum ștergem conținutul vechi stocat (tranzitoriu). Există două moduri de a șterge (șterge) tranzitorii:
Ștergere automată
Interesantul despre tranzitorii este că acestea expiră automat dacă setăm timpul de expirare (durata de viață) . Dacă încercați să extrageți un tranzitor din baza de date după ce a expirat, WordPress îl va șterge automat, prevenind orice dezordine. Tranzitorul va fi recreat odată ce cineva deschide site-ul web. În acest fel ne asigurăm că avem conținut proaspăt din API-ul local sau de la distanță.
Ștergere manuală
Uneori va trebui să forțăm trecătorul să moară devreme ștergându-l manual. Acest lucru este util atunci când o anumită activitate (adăugarea unui nou element de meniu, salvarea sau actualizarea unei postări, adăugarea sau actualizarea unei categorii etc.) va face ca datele cache să fie inerente vechi și să aibă nevoie de actualizare:
Funcția pe care trebuie să o folosim este
delete_transient ($ transient_name)
iar în cazul nostru ar trebui să fie:
delete_transient ( 'unique_listing_posts_query_results_name' );
Notă: Este important să nu utilizați tranzitorii pentru stocarea datelor valoroase care nu pot fi recreate!
De ce ar trebui să folosim API-uri tranzitorii?
Putem folosi API-ul Transitori ori de câte ori avem o valoare intensă din punct de vedere al calculului, care nu se schimbă foarte des și pe care doriți să o cache. În WordPress, acesta va fi de obicei obiectul rezultat dintr-o interogare a bazei de date, dar ar putea fi într-adevăr orice ați stoca într-o variabilă, indiferent dacă este o valoare scalară, o matrice sau un obiect.
Deci, în general, tranzitorii sunt minunați atunci când efectuați interogări complexe în temele și pluginurile dvs.

Avantajele memorării în cache a răspunsurilor la distanță sau locale
Răspunsuri API de la distanță
API-urile la distanță efectuează întotdeauna mai multe apeluri sau solicitări către servere la distanță și există o anumită latență suplimentară. Acest lucru necesită timp și provoacă întârzieri. De asemenea, unele API-uri la distanță pot avea limite de rată, ceea ce înseamnă că puteți atinge limita maximă de solicitări într-o anumită perioadă de timp.
Și, după cum știți deja, putem profita de tranzitorii API pentru a memora în cache răspunsul (rezultatul) de pe serverul de la distanță și pentru a-l stoca în baza noastră de date. Acum putem folosi
get_transient ();
metoda și afișați rezultatul / conținutul stocat (în cache) oriunde este necesar, fără a efectua alte apeluri sau solicitări de la distanță.
Toate acestea vor:
- Reduceți apelurile și solicitările HTTPS la distanță
- Reduceți utilizarea serverului CPU
- Îmbunătățiți timpul de încărcare a paginii site-ului web
Răspunsuri API locale
- practic HTML sau rezultatele interogării din baza de date. Puteți utiliza API-ul Transitori nu numai pentru stocarea în cache a răspunsurilor la distanță, ci și pentru stocarea conținutului HTML sau a rezultatelor interogării în baza de date locală. Este foarte util dacă doriți să afișați o secțiune HTML repetabilă pe site-ul dvs. web (widget-uri, glisante, meniuri etc.) sau doar pentru a preveni interogările complexe sau lente de baze de date care să fie declanșate de fiecare dată când cineva vă vizitează site-ul web.
Unde și când se utilizează tranzitorii?
- Interogări complexe și personalizate de baze de date
- Meniuri de navigare WordPress
- Widget-uri din bara laterală care afișează informații precum; tweets, o listă de vizitatori recenți ai site-ului sau o listă de postări dintr-o anumită categorie
- Nori de etichete în cache
- Memorarea în cache a cererilor HTTP externe
Utilizare și exemple
După atâtea explicații este timpul pentru exemple reale.
Utilizare de bază
funcția get_my_data () { $ data = get_transient ('numele_transientul meu'); if (false === $ data) {// Tranzitorul a expirat / nu a fost setat $ data = fetch_my_data (); // Trageți date din sursa originală set_transient ('numele_transientul meu', $ date, HOUR_IN_SECONDS); } returnează $ date; }
funcția fetch_my_data () poate stoca obiectul WP_Query, datele json, conținutul html etc.
Exemplu de bază
După cum am explicat deja, acest tip de cache este bun pentru a salva rezultatul operațiunilor lungi, iar cel mai simplu exemplu este accesarea API-urilor externe, cum ar fi Facebook.
Imaginați-vă că avem următoarea funcție, care accesează API-ul Facebook, solicită un obiect (mai precis, o pagină) your-website.url și returnează numărul de aprecieri ale paginii:
funcția get_facebook_likes () { $ result = wp_remote_get ('https://graph.facebook.com/your-website.url'); $ result = cod_json (wp_remote_retrieve_body ($ result)); returnează $ result-> aprecieri; } ecou „Facebook likes:”. get_facebook_likes ();
Timpul de execuție al acestei funcții depinde de mulți factori, inclusiv locația serverului dvs. față de serverele Facebook, starea și viteza rețelei etc. În medie, o funcție poate dura 1-3 secunde.
Aceasta înseamnă că, atunci când utilizați această funcție pe site, timpul de încărcare al fiecărei pagini va crește cu 1-3 secunde. Mai mult, dacă numim această funcție de peste 500 de ori în 500 de secunde, Facebook va începe să genereze o eroare în loc de un rezultat.
Pentru a accelera această caracteristică, putem utiliza API-ul WordPress Transients și putem salva rezultatul timp de 1 oră:
funcția get_facebook_likes () { if (false === ($ likes = get_transient ('fb_likes')))) { $ result = wp_remote_get ('https://graph.facebook.com/your-website.url'); $ result = cod_json (wp_remote_retrieve_body ($ result)); $ aprecieri = $ rezultat-> aprecieri; // Setați tranzitoriu pentru o oră în secunde set_transient ('fb_likes', $ likes, 1 * HOUR_IN_SECONDS); } returnează $ like-uri; }
Astfel, atunci când această funcție este apelată pentru prima dată, după ce primește o solicitare de la Facebook, WordPress va scrie rezultatul în baza de date și în viitor va returna acest rezultat din baza de date timp de o oră fără a face cereri repetate către serverul Facebook. Și după o oră, funcția va apela din nou la Facebook pentru date.
Cu această abordare, un singur apel către această funcție pe oră va crește timpul de solicitare cu 1-3 secunde, iar apelurile ulterioare vor fi emise instantaneu.
Exemplu mai complex
Imaginați-vă că avem un site web cu aproximativ 100 de categorii și aproximativ 50 000 de postări, iar în designul de postare unică al site-ului web avem un widget care arată N postările aferente din categoria în care se află postarea curentă. Așa cum era de așteptat, această interogare complexă va dura ceva timp pentru a prelua rezultatul din baza de date și a-l afișa pe site.
Acum imaginați-vă că aveți 10 000 de utilizatori care accesează site-ul în același timp. Aceasta înseamnă că vom avea peste 10 000 de cereri de baze de date care trebuie să facă interogarea (aceasta este o interogare complexă, deoarece ar căuta prin tabele wp_terms, wp_term_relationships, wp_term_taxonomy, wp_posts , deci sunt mai mult de 10 000 de interogări), rezultat pentru N postări din categoria aferentă și pentru a le arăta pe frontend. Acest lucru, la rândul său, ar suprasolicita baza de date și ar întârzia timpul de încărcare general al site-ului web și, în unele cazuri, chiar îl va bloca din cauza supraîncărcării bazei de date.
Și aici apare întrebarea cum putem optimiza și reduce numărul de interogări și cereri de baze de date. De ce să avem atât de multe interogări de fiecare dată când putem profita de API-ul tranzitorii și să stocăm în cache obiectul de interogare sau să stocăm în cache întreaga ieșire HTML? În acest fel, vom reduce și optimiza numărul de interogări în baza de date, ceea ce va duce la o performanță mai bună a site-ului web și la o experiență mai bună a utilizatorului.
În cazul nostru, interogările vor căuta în tabele wp_terms, wp_term_relationships, wp_term_taxonomy, wp_posts pentru a obține toate rezultatele așteptate.
Iată un exemplu complet al modului în care putem realiza acest lucru:
funcție show_posts_from_category () { $ args = array ( 'cat' => 555, // ID categorie aleatorie 'posts_per_page' => 8, // Număr aleatoriu de postări corelate de afișat 'No_found_rows' => adevărat, ); $ hash = md5 ($ args ['cat']); // Hash MD5 al ID-ului categoriei $ tranzient_key = 'categorie-'. $ hash; // Cheie tranzitorie if (false === ($ posts_from_category_html = get_transient ($ transient_key))): // Tranzitorul a expirat / nu a fost setat $ the_query = new WP_Query ($ args); // Obțineți interogarea ob_start (); // Activați bufferul de ieșire while ($ the_query-> have_posts ()): $ the_query-> the_post (); ?> <div class = "item"> <div class = "bigthumb"> <a href="<?php the_permalink();?> "rel =" bookmark "title =" <? php the_title ();?> "> <? php if (has_post_thumbnail ()) the_post_thumbnail ('big-thumb') ); ?> </a> </div> <h3> <a href="<?php the_permalink();?> "rel =" bookmark "title =" <? php the_title ();?> "> <? php the_title (); ?> </a> </h3> <? php the_excerpt (); ?> </div> <? php în cele din urmă; $ post_from_category_html = ob_get_contents (); // Obține conținutul bufferului de ieșire fără a-l șterge ob_end_clean (); // Dezactivează această memorie tampon de ieșire set_transient ($ tranzient_key, $ posts_from_category_html, $ transient_expire = 15 * MINUTE_IN_SECONDS); // Setarea tranzitoriei cu timp de expirare de 15 minute wp_reset_postdata (); endif; returnează $ post_from_category_html; }
Gânduri finale
Memorarea în cache este o modalitate excelentă de a accelera lucrurile, dar trebuie să știi exact ce cache, unde o poți face, când și cum, altfel riști să te confrunți cu consecințe neașteptate.
Dacă nu sunteți sigur dacă ceva funcționează conform intenției, treceți întotdeauna la profilare - examinați fiecare interogare în baza de date, consultați toate apelurile funcției PHP, calendarul și utilizarea memoriei.
API-ul Transients este o modalitate excelentă de a optimiza timpul de încărcare al site-ului dvs. WordPress și de a oferi o experiență de utilizator excepțională. Utilizarea tranzitorilor în pluginuri și teme este simplă și adaugă doar câteva linii suplimentare de cod. Atunci când este utilizat în situațiile potrivite - cum ar fi interogări lungi în baza de date sau date procesate complexe - poate economisi câteva secunde din timpul de încărcare de pe site-ul dvs.