Cosa sono le API transitorie?

Pubblicato: 2020-12-16

Le prestazioni del sito web spesso ruotano attorno all'idea della memorizzazione nella cache: memorizzare i dati in uno stato pronto e di accesso più rapido, in modo che vengano riprodotti più rapidamente dai browser. L'API Transients di WordPress è uno strumento per la memorizzazione nella cache e un modo potente per migliorare le prestazioni dei siti Web WordPress.

Che cos'è la cache e perché utilizzarla?

Ogni volta che un browser richiede una pagina Web, il server di servizio deve eseguire molti calcoli complessi e dispendiosi in termini di tempo, il che porta a ritardi. Dopo aver eseguito una query, grazie alla tecnologia di caching, il server può ricordare il risultato finale e su una seconda richiesta fornirlo al browser senza dover ripetere gli stessi calcoli. Pertanto, la capacità di memorizzare nella cache e riutilizzare le risorse precedenti è fondamentale per ottimizzare le prestazioni.

Molto semplicemente la memorizzazione nella cache fornisce l'opzione per memorizzare temporaneamente le informazioni nel livello di memorizzazione nella cache.

Quali sono i tipi di memorizzazione nella cache?

Esistono diversi tipi di memorizzazione nella cache e, utilizzando una combinazione di essi, otterrai un livello di prestazioni superiore.

tipi di memorizzazione nella cache

Caching del browser

Prima di aprire il contenuto di una pagina web, il tuo browser necessita di un mucchio di cose come file JavaScript, fogli di stile, caratteri e così via, che vengono scaricati in aggiunta al contenuto della pagina.

Se un browser memorizza nella cache questi file, non sarà necessario scaricarli ogni volta che si carica il sito web. Il caricamento del sito per la prima volta in genere richiede alcuni secondi, ma dopo che il browser ha memorizzato nella cache i file, il tempo di caricamento si riduce notevolmente.

Caching del server

Memorizzazione nella cache del server significa salvare il file HTML per una determinata pagina e utilizzarlo per ogni richiesta successiva. Questa è la cosiddetta cache della pagina intera.

Esiste un altro tipo di cache del server: la cache degli oggetti, che, a differenza della cache della pagina intera, memorizza nella cache solo alcuni bit (pezzi) di informazioni.

Caching della pagina

Considerata la cache più efficace. Il suo nome è autoesplicativo per il modo in cui funziona. Quando l'utente "A" visita una pagina, il sito web la costruirà e ne restituirà il contenuto al browser dell'utente. Con la cache della pagina in esecuzione, il contenuto della pagina viene salvato in modo che quando l'utente "B" visita la stessa pagina, la cache della pagina riproduca il contenuto inviato in precedenza.

Il più grande vantaggio di Page Cache è che la pagina memorizzata nella cache ritorna quasi al momento dell'accesso. Di conseguenza, milioni di richieste vengono elaborate e le pagine riprodotte anche sul server più debole con la velocità di memoria più bassa e un utilizzo ridotto della CPU.

Ma questo tipo di cache ha anche i suoi svantaggi: ad esempio, l'impossibilità di memorizzare nella cache le pagine per un utente autorizzato o per un utente il cui contenuto della pagina dipende dalle variabili utente correnti.

Caching del database

La memorizzazione nella cache del database è un processo incluso nella progettazione di applicazioni informatiche che generano pagine Web su richiesta (dinamicamente) accedendo ai database di backend. Una cache del database migliora il database primario rimuovendo la pressione non necessaria su di esso, in genere sotto forma di dati letti a cui si accede di frequente. La cache stessa può funzionare in una serie di aree, incluso il database, l'applicazione o come livello autonomo.

Quando queste applicazioni vengono distribuite su ambienti multilivello che coinvolgono client basati su browser, server di applicazioni Web e database back-end, viene utilizzata la memorizzazione nella cache del database di livello intermedio per ottenere scalabilità e prestazioni elevate.

Memorizzazione nella cache degli oggetti

La memorizzazione nella cache degli oggetti in WordPress (cache degli oggetti) implica la memorizzazione delle query del database. È un meccanismo di sistema integrato che consente di salvare dati (oggetti) di qualsiasi tipo e recuperarli quando necessario. Questa cache viene utilizzata per memorizzare i risultati di operazioni complesse.

Se abilitato sul tuo sito WordPress, aiuta ad accelerare i tempi di esecuzione di PHP, a fornire contenuti ai visitatori del sito più velocemente e a ridurre il carico sul database.

CDN (reti di distribuzione dei contenuti)

Si tratta di un'infrastruttura di rete distribuita geograficamente che fornisce una rapida consegna di contenuti agli utenti di siti e servizi web. I server inclusi nel CDN sono dislocati geograficamente in modo tale da rendere minimi i tempi di risposta per gli utenti del sito / servizio.

Cos'è un'API Transients in WordPress?

L'API Transients è il modo per archiviare un blocco di informazioni (una stringa di codice, contenuto HTML, WP_Query Objects, JSON) nel database del sito Web anziché nella cache del browser. L'API Transients è molto simile all'API delle opzioni, ma la differenza principale è che l'API Transients ha un tempo di scadenza o meglio una durata.

Le tre operazioni principali per i transitori sono l' impostazione dei valori, l'acquisizione dei valori e l'eliminazione dei valori :

1. Imposta un transitorio -

 set_transient ($ chiave, $ valore, $ scadenza);

Per impostare un transiente puoi usare la funzione set_transient () che ha tre componenti:

  • Chiave : nome breve univoco del transiente. Deve contenere 172 caratteri o meno.
  • Valore : qualsiasi tipo di variabile PHP che contiene le informazioni che verranno archiviate nel database.
  • Tempo di scadenza (durata): la quantità di tempo per la quale le informazioni verranno archiviate.

Quindi, ad esempio, se vogliamo salvare la nostra query sui post delle inserzioni per un giorno:

 set_transient ('unique_listing_posts_query_results_name',$ list_posts_query_results, DAY_IN_SECONDS);

Come puoi vedere, abbiamo utilizzato una (DAY_IN_SECONDS) delle numerose costanti di tempo introdotte in WordPress 3.5 per esprimere facilmente l'ora. Ecco un elenco completo delle costanti di tutti i tempi:

 MINUTE_IN_SECONDS = 60 (secondi)
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. Ottieni un transitorio -

 get_transient ($ chiave);

Per ottenere un transitorio salvato possiamo usare

 get_transient ($ transient_name);

Nel nostro caso potremmo recuperare i nostri post che elencano i risultati delle query con:

 get_transient ( 'unique_listing_posts_query_results_name' );

Vedremo di più su questo più avanti nella nostra sezione di esempio.

3. Elimina un transitorio -

 delete_transient ($ chiave);

Come spiegato nelle sottosezioni precedenti, possiamo utilizzare l'API Transients per ottenere e archiviare risposte remote o locali (contenuto o query dal nostro database) al nostro database.

Tuttavia, ecco la domanda su come eliminare il vecchio contenuto memorizzato (transitorio). Esistono due modi per cancellare (eliminare) i transitori:

Cancellazione automatica

La cosa interessante dei transitori è che scadono automaticamente se impostiamo il tempo di scadenza (durata della vita) . Se tenti di recuperare un transitorio dal tuo database dopo che è scaduto, WordPress lo eliminerà automaticamente, prevenendo qualsiasi confusione. Il transitorio verrà ricreato una volta che qualcuno apre il sito web. In questo modo ci assicuriamo di avere nuovi contenuti dall'API remota o locale.

Eliminazione manuale

A volte sarà necessario forzare la morte anticipata del transiente eliminandolo manualmente. Ciò è utile quando una determinata attività (aggiunta di una nuova voce di menu, salvataggio o aggiornamento di un post, aggiunta o aggiornamento di una categoria ecc.) Renderà i dati memorizzati nella cache intrinsecamente obsoleti e necessitano di aggiornamento:

La funzione che dobbiamo usare è

 delete_transient ($ transient_name)

e nel nostro caso dovrebbe essere:

 delete_transient ( 'unique_listing_posts_query_results_name' );

Nota: è importante NON utilizzare transitori per memorizzare dati preziosi che non possono essere ricreati!

Perché dovremmo usare le API Transients?

Possiamo utilizzare l'API Transients ogni volta che abbiamo un valore ad alta intensità di calcolo che non cambia molto spesso e che desideri memorizzare nella cache. In WordPress, questo di solito sarà l'oggetto risultante da una query di database, ma potrebbe davvero essere qualsiasi cosa memorizzeresti in una variabile, sia un valore scalare, un array o un oggetto.

Quindi, tutto sommato, i transienti sono fantastici quando esegui query complesse nei tuoi temi e plugin.

Vantaggi della memorizzazione nella cache delle risposte remote o locali

Risposte API remote

Le API remote effettuano sempre diverse chiamate o richieste a server remoti e c'è qualche latenza aggiuntiva. Ciò richiede tempo e causa ritardi. Inoltre, alcune API remote possono avere limiti di velocità, il che significa che puoi raggiungere il limite massimo di richieste entro un determinato periodo di tempo.

E come già sai, possiamo sfruttare l'API Transients per memorizzare nella cache la risposta (risultato) dal server remoto e per memorizzarla nel nostro database. Ora possiamo usare il file

 get_transient ();

e mostra il risultato / contenuto archiviato (memorizzato nella cache) ovunque necessario senza effettuare altre chiamate o richieste remote.

Tutto questo:

  • Riduci le chiamate e le richieste HTTPS remote
  • Riduci l'utilizzo del server CPU
  • Migliora il tempo di caricamento della pagina del sito web

Risposte API locali

- fondamentalmente l'HTML o i risultati della query dal database. È possibile utilizzare l'API Transients non solo per la memorizzazione nella cache delle risposte remote, ma anche per l'archiviazione del contenuto HTML o dei risultati delle query nel database locale. È molto utile se vuoi mostrare una sezione HTML ripetibile sul tuo sito web (widget, cursori, menu, ecc.) O semplicemente per evitare che query di database complesse o lente vengano attivate ogni volta che qualcuno visita il tuo sito web.

Dove e quando utilizzare i transitori?

  • Query di database complesse e personalizzate
  • Menu di navigazione di WordPress
  • Widget della barra laterale che visualizzano informazioni come; tweet, un elenco di visitatori recenti del sito o un elenco di post di una determinata categoria
  • Memorizzazione nella cache dei tag cloud
  • Memorizzazione nella cache delle richieste HTTP esterne

Utilizzo ed esempi

Dopo tante spiegazioni è tempo di esempi reali.

Utilizzo di base

 funzione get_my_data () {

$ data = get_transient ('my_transient_name');
if (false === $ data) {// Transient era scaduto / non è stato impostato

$ data = fetch_my_data (); // Estrae i dati dalla fonte originale

set_transient ('my_transient_name', $ data, HOUR_IN_SECONDS);

}

restituire $ dati;

}

La funzione fetch_my_data () può memorizzare oggetti WP_Query, dati json, contenuto html , ecc.

Esempio di base

Come abbiamo già spiegato, questo tipo di memorizzazione nella cache è utile per salvare il risultato di lunghe operazioni e l'esempio più semplice è l'accesso ad API esterne, come Facebook.

Immagina di avere la seguente funzione, che accede all'API di Facebook, richiede un oggetto (più precisamente una pagina) your-website.url e restituisce il numero di like della pagina:

 funzione get_facebook_likes () {

$ risultato = wp_remote_get ('https://graph.facebook.com/your-website.url');

$ risultato = json_decode (wp_remote_retrieve_body ($ risultato));

restituire $ risultato-> mi piace;

}

echo "Mi piace a Facebook:". get_facebook_likes ();

Il tempo di esecuzione di questa funzione dipende da molti fattori, inclusa la posizione del tuo server rispetto ai server di Facebook, lo stato e la velocità della rete, ecc. In media, una funzione può richiedere 1-3 secondi.

Ciò significa che quando si utilizza questa funzione sul sito, il tempo di caricamento di ciascuna pagina aumenterà di 1-3 secondi. Inoltre, se chiamiamo questa funzione più di 500 volte in 500 secondi, Facebook inizierà a generare un errore invece di un risultato.

Per velocizzare questa funzione, possiamo utilizzare l'API Transients di WordPress e salvare il risultato per 1 ora:

 funzione get_facebook_likes () {
if (false === ($ likes = get_transient ('fb_likes'))) {
$ risultato = wp_remote_get ('https://graph.facebook.com/your-website.url');
$ risultato = json_decode (wp_remote_retrieve_body ($ risultato));
$ mi piace = $ risultato-> mi piace;

// Imposta il transitorio per un'ora in secondi
set_transient ('fb_likes', $ piace, 1 * HOUR_IN_SECONDS);
}

restituire $ mi piace;
}

Pertanto, quando questa funzione viene chiamata per la prima volta, dopo aver ricevuto una richiesta da Facebook, WordPress scriverà il risultato nel database e in futuro restituirà questo risultato dal database per un'ora senza fare richieste ripetute al server di Facebook. E dopo un'ora, la funzione tornerà nuovamente a Facebook per i dati.

Con questo approccio, solo una chiamata a questa funzione all'ora aumenterà il tempo di richiesta di 1-3 secondi e le chiamate successive verranno emesse immediatamente.

Esempio più complesso

Immagina di avere un sito web con circa 100 categorie e circa 50.000 post, e nel design del post singolo del sito web abbiamo un widget che mostra gli N post correlati dalla categoria in cui si trova il post corrente. Come previsto, questa query complessa richiederà del tempo per prendere il risultato dal database e mostrarlo sul sito web.

Ora immagina di avere 10.000 utenti che accedono contemporaneamente al sito web. Ciò significa che avremo oltre 10.000 richieste di database che devono eseguire la query (questa è una query complessa in quanto cercherebbe nelle tabelle wp_terms, wp_term_relationships, wp_term_taxonomy, wp_posts , quindi sono più di 10.000 query), per ottenere il risultato per gli N post della categoria correlata e per mostrarli sul frontend. Ciò, a sua volta, sovraccaricherebbe il database e ritarderebbe il tempo di caricamento complessivo del sito Web e, in alcuni casi, addirittura lo bloccherebbe a causa del sovraccarico del database.

E qui arriva la domanda su come possiamo ottimizzare e ridurre il numero di query e richieste di database. Perché avere così tante query ogni volta che possiamo sfruttare l'API Transients e memorizzare semplicemente nella cache l'oggetto query o nella cache l'intero output HTML? In questo modo ridurremo e ottimizzeremo il numero di query di database, il che porterà a migliori prestazioni del sito Web e una migliore esperienza utente.

Nel nostro caso le query cercheranno nelle tabelle wp_terms, wp_term_relationships, wp_term_taxonomy, wp_posts per ottenere tutti i risultati attesi.

Ecco un esempio completo di come possiamo ottenere questo risultato:

 funzione show_posts_from_category () {
$ args = array (
'cat' => 555, // ID categoria casuale
'posts_per_page' => 8, // Numero casuale di post correlati da visualizzare
'No_found_rows' => vero,
);

$ hash = md5 ($ args ['cat']); // Hash MD5 dell'ID categoria
$ transient_key = 'category-'. $ hash; // Chiave transitoria

if (false === ($ posts_from_category_html = get_transient ($ transient_key))): // Transient era scaduto / non è stato impostato

$ the_query = new WP_Query ($ args); // Ottieni la query

ob_start (); // Attiva il buffering dell'output

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
endwhile;

$ post_from_category_html = ob_get_contents (); // Ottiene il contenuto del buffer di output senza cancellarlo
ob_end_clean (); // Disattiva il buffering dell'output

set_transient ($ transient_key, $ posts_from_category_html, $ transient_expire = 15 * MINUTE_IN_SECONDS); // Impostazione del transitorio con un tempo di scadenza di 15 minuti

wp_reset_postdata ();
finisci se;

return $ post_from_category_html;
}

Pensieri finali

La memorizzazione nella cache è un ottimo modo per velocizzare le cose, ma devi sapere esattamente cosa stai memorizzando nella cache, dove puoi farlo, quando e come, altrimenti rischi di affrontare conseguenze impreviste.

Se non sei sicuro che qualcosa funzioni come previsto, passa sempre alla profilazione: guarda ogni query sul database, guarda tutte le chiamate di funzione PHP, i tempi e l'utilizzo della memoria.

L'API Transients è un ottimo modo per ottimizzare il tempo di caricamento del tuo sito Web WordPress e per offrire un'esperienza utente eccezionale. L'utilizzo dei transitori nei plugin e nei temi è semplice e aggiunge solo poche righe di codice in più. Se utilizzato nelle giuste situazioni, come lunghe query di database o dati elaborati complessi, può far risparmiare secondi sui tempi di caricamento del tuo sito.