¿Qué son las API transitorias?

Publicado: 2020-12-16

El rendimiento del sitio web a menudo gira en torno a la idea del almacenamiento en caché: almacenar datos en un estado listo y de acceso más rápido, para que los navegadores los reproduzcan más rápidamente. La API de WordPress Transients es una herramienta para el almacenamiento en caché y una forma poderosa de mejorar el rendimiento de los sitios web de WordPress.

¿Qué es el almacenamiento en caché y por qué usarlo?

Siempre que un navegador solicita una página web, el servidor de servicio debe realizar muchos cálculos complejos y que requieren mucho tiempo, lo que genera retrasos. Después de ejecutar una consulta, gracias a la tecnología de almacenamiento en caché, el servidor puede recordar el resultado final y, ante una segunda solicitud, proporcionarlo al navegador sin tener que volver a realizar los mismos cálculos. Por lo tanto, la capacidad de almacenar en caché y reutilizar recursos anteriores es crucial para optimizar el rendimiento.

El almacenamiento en caché ofrece la opción de almacenar información temporalmente en la capa de almacenamiento en caché.

¿Cuáles son los tipos de almacenamiento en caché?

Existen diferentes tipos de almacenamiento en caché y, al usar una combinación de ellos, logrará un mayor nivel de rendimiento.

tipos de almacenamiento en caché

Almacenamiento en caché del navegador

Antes de abrir el contenido de una página web, su navegador necesita un montón de cosas como archivos JavaScript, hojas de estilo, fuentes, etc., todo lo cual descarga además del contenido de la página.

Si un navegador almacena en caché estos archivos, no será necesario descargarlos cada vez que cargue el sitio web. Cargar el sitio por primera vez generalmente toma unos segundos, pero después de que el navegador almacena esos archivos en caché, el tiempo de carga se reduce significativamente.

Almacenamiento en caché del servidor

El almacenamiento en caché del servidor significa guardar el archivo HTML para una página en particular y usarlo para cada solicitud posterior. Este es el llamado caché de página completa.

Existe otro tipo de caché de servidor: caché de objetos, que, a diferencia de la caché de página completa, almacena en caché solo ciertos bits (piezas) de información.

Almacenamiento en caché de páginas

Considerado el caché más efectivo. Su nombre se explica por sí mismo por la forma en que funciona. Cuando el usuario 'A' visita una página, el sitio web la creará y devolverá su contenido al navegador del usuario. Con la caché de página en ejecución, el contenido de esta página se guarda de modo que cuando el usuario 'B' visita la misma página, la caché de la página reproduce el contenido enviado anteriormente.

La mayor ventaja de Page Cache es que la página almacenada en caché regresa casi en el momento del acceso. Como resultado, se procesan millones de solicitudes y se reproducen páginas incluso en el servidor más débil con la velocidad de memoria más baja y el uso de CPU reducido.

Pero este tipo de caché también tiene sus inconvenientes: por ejemplo, la imposibilidad de almacenar páginas en caché para un usuario autorizado, o para un usuario cuyo contenido de página depende de las variables de usuario actual.

Almacenamiento en caché de la base de datos

El almacenamiento en caché de la base de datos es un proceso incluido en el diseño de aplicaciones informáticas que generan páginas web bajo demanda (dinámicamente) al acceder a bases de datos back-end. Una caché de base de datos mejora su base de datos principal al eliminar la presión innecesaria sobre ella, generalmente en forma de datos de lectura a los que se accede con frecuencia. La caché en sí puede operar en varias áreas, incluida su base de datos, aplicación o como una capa independiente.

Cuando estas aplicaciones se implementan en entornos de varios niveles que involucran clientes basados ​​en navegador, servidores de aplicaciones web y bases de datos back-end, se utiliza el almacenamiento en caché de la base de datos de nivel medio para lograr una alta escalabilidad y rendimiento.

Almacenamiento en caché de objetos

El almacenamiento en caché de objetos en WordPress (caché de objetos) implica almacenar consultas de base de datos. Es un mecanismo de sistema integrado que le permite guardar datos (objetos) de cualquier tipo y recuperarlos cuando sea necesario. Esta caché se utiliza para almacenar los resultados de operaciones complejas.

Cuando está habilitado en su sitio de WordPress, ayuda a acelerar los tiempos de ejecución de PHP, entregar contenido a los visitantes del sitio más rápido y reducir la carga en la base de datos.

CDN (redes de entrega de contenido)

Es una infraestructura de red distribuida geográficamente que proporciona una entrega rápida de contenido a los usuarios de sitios y servicios web. Los servidores incluidos en la CDN están ubicados geográficamente de tal manera que el tiempo de respuesta para los usuarios del sitio / servicio es mínimo.

¿Qué es una API transitoria en WordPress?

La API de transitorios es la forma de almacenar un bloque de información (una cadena de código, contenido HTML, WP_Query Objects, JSON) en la base de datos del sitio web en lugar del almacenamiento en caché del navegador. La API de transitorios es muy similar a la API de opciones, pero la principal diferencia es que la API de transitorios tiene un tiempo de caducidad o mejor dicho tiempo de vida.

Las tres operaciones principales para transitorios son establecer valores, obtener valores y eliminar valores :

1. Establecer un transitorio -

 set_transient ($ clave, $ valor, $ expira);

Para establecer un transitorio, puede usar la función set_transient () que tiene tres componentes:

  • Clave : nombre breve y exclusivo del transitorio. Debe tener 172 caracteres o menos de longitud.
  • Valor : cualquier tipo de variable PHP que contenga la información que se almacenará en la base de datos.
  • Tiempo de vencimiento (vida útil): la cantidad de tiempo durante el cual se almacenará la información.

Entonces, por ejemplo, si queremos guardar nuestra consulta de publicaciones de listado por un día:

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

Como puede ver, hemos utilizado una (DAY_IN_SECONDS) de las varias constantes de tiempo introducidas en WordPress 3.5 para expresar fácilmente el tiempo. Aquí hay una lista completa de constantes de todos los tiempos:

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

 get_transient ($ clave);

Para obtener un transitorio guardado, podemos usar

 get_transient ($ nombre_transitorio);

En nuestro caso, podríamos obtener nuestras publicaciones que enumeran los resultados de la consulta con:

 get_transient ( 'unique_listing_posts_query_results_name' );

Veremos más sobre eso más adelante en nuestra sección de ejemplos.

3. Eliminar un transitorio -

 delete_transient ($ clave);

Como explicamos en las subsecciones anteriores, podemos usar Transients API para obtener y almacenar respuestas remotas o locales (contenido o consulta de nuestra base de datos) en nuestra base de datos.

Sin embargo, aquí surge la pregunta de cómo eliminamos el contenido almacenado antiguo (transitorio). Hay dos formas de borrar (eliminar) transitorios:

Eliminación automática

Lo bueno de los transitorios es que caducan automáticamente si establecemos el tiempo de caducidad (vida útil) . Si intenta recuperar un transitorio de su base de datos después de que haya expirado, WordPress lo eliminará automáticamente, evitando cualquier desorden. El transitorio se volverá a crear una vez que alguien abra el sitio web. De esta manera, nos aseguramos de tener contenido nuevo de la API local o remota.

Eliminación manual

A veces necesitaremos forzar al transitorio a morir antes de tiempo eliminándolo manualmente. Esto es útil cuando una actividad dada (agregar un nuevo elemento de menú, guardar o actualizar una publicación, agregar o actualizar una categoría, etc.) hará que los datos almacenados en caché estén inherentemente obsoletos y necesiten actualizarse:

La función que debemos utilizar es

 delete_transient ($ nombre_transitorio)

y en nuestro caso debería ser:

 delete_transient ( 'unique_listing_posts_query_results_name' );

Nota: ¡ Es importante NO utilizar transitorios para almacenar datos valiosos que no se pueden volver a crear!

¿Por qué deberíamos utilizar API transitorias?

Podemos usar la API de transitorios siempre que tengamos un valor computacionalmente intensivo que no cambie con mucha frecuencia y que desee almacenar en caché. En WordPress, este suele ser el objeto resultante de una consulta de base de datos, pero realmente podría ser cualquier cosa que almacenarías en una variable, ya sea un valor escalar, una matriz o un objeto.

Entonces, en general, los transitorios son geniales cuando realiza consultas complejas en sus temas y complementos.

Beneficios de almacenar en caché respuestas locales o remotas

Respuestas de API remotas

Las API remotas siempre realizan varias llamadas o solicitudes a servidores remotos y hay una latencia adicional. Esto lleva tiempo y provoca retrasos. Además, algunas API remotas pueden tener límites de velocidad, lo que significa que puede alcanzar el límite máximo de solicitudes dentro de un período de tiempo determinado.

Y como ya sabes, podemos aprovechar la API de Transients para almacenar en caché la respuesta (resultado) del servidor remoto y almacenarla en nuestra base de datos. Ahora podemos usar el

 get_transient ();

y mostrar el resultado / contenido almacenado (en caché) donde sea necesario sin realizar otras llamadas o solicitudes remotas.

Todo esto hará:

  • Reducir las llamadas y solicitudes HTTPS remotas
  • Reducir el uso del servidor de CPU
  • Mejorar el tiempo de carga de la página del sitio web

Respuestas de API locales

- básicamente el HTML o los resultados de la consulta de la base de datos. Puede utilizar la API de transitorios no solo para almacenar en caché respuestas remotas, sino también para almacenar contenido HTML o resultados de consultas en la base de datos local. Es muy útil si desea mostrar una sección HTML repetible en su sitio web (widgets, controles deslizantes, menús, etc.) o simplemente para evitar que se activen consultas de base de datos complejas o lentas cada vez que alguien visita su sitio web.

¿Dónde y cuándo utilizar transitorios?

  • Consultas de bases de datos complejas y personalizadas
  • Menús de navegación de WordPress
  • Widgets de la barra lateral que muestran información como; tweets, una lista de visitantes recientes del sitio o una lista de publicaciones de una determinada categoría
  • Almacenamiento en caché de nubes de etiquetas
  • Almacenamiento en caché de solicitudes HTTP externas

Uso y ejemplos

Después de tantas explicaciones es el momento de dar ejemplos reales.

Uso básico

 function get_my_data () {

$ datos = get_transient ('my_transient_name');
if (false === $ data) {// El transitorio expiró / no se ha configurado

$ datos = fetch_my_data (); // Extrae datos de la fuente original

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

}

devolver $ datos;

}

La función fetch_my_data () puede almacenar el objeto WP_Query, datos json, contenido html , etc.

Ejemplo básico

Como ya hemos explicado, este tipo de almacenamiento en caché es bueno para guardar el resultado de operaciones largas, y el ejemplo más simple es acceder a API externas, como Facebook.

Imagina que tenemos la siguiente función, que accede a la API de Facebook, solicita un objeto (más precisamente, una página) your-website.url y devuelve el número de likes de la página:

 function get_facebook_likes () {

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

$ resultado = json_decode (wp_remote_retrieve_body ($ resultado));

return $ resultado-> me gusta;

}

echo "Me gusta de Facebook:". get_facebook_likes ();

El tiempo de ejecución de esta función depende de muchos factores, incluida la ubicación de su servidor en relación con los servidores de Facebook, el estado y la velocidad de la red, etc. En promedio, una función puede tardar entre 1 y 3 segundos.

Esto significa que al usar esta función en el sitio, el tiempo de carga de cada página aumentará de 1 a 3 segundos. Además, si llamamos a esta función más de 500 veces en 500 segundos, Facebook comenzará a generar un error en lugar de un resultado.

Para acelerar esta función, podemos usar la API de transitorios de WordPress y guardar el resultado durante 1 hora:

 function get_facebook_likes () {
if (false === ($ me gusta = get_transient ('fb_likes'))) {
$ resultado = wp_remote_get ('https://graph.facebook.com/your-website.url');
$ resultado = json_decode (wp_remote_retrieve_body ($ resultado));
$ me gusta = $ resultado-> me gusta;

// Establecer transitorio durante una hora en segundos
set_transient ('fb_likes', $ me gusta, 1 * HOUR_IN_SECONDS);
}

return $ me gusta;
}

Por lo tanto, cuando se llama a esta función por primera vez, después de recibir una solicitud de Facebook, WordPress escribirá el resultado en la base de datos y en el futuro devolverá este resultado de la base de datos durante una hora sin hacer solicitudes repetidas al servidor de Facebook. Y después de una hora, la función volverá a recurrir a Facebook para obtener datos.

Con este enfoque, solo una llamada a esta función por hora aumentará el tiempo de solicitud en 1-3 segundos y las llamadas posteriores se emitirán instantáneamente.

Ejemplo más complejo

Imagine que tenemos un sitio web con aproximadamente 100 categorías y aproximadamente 50 000 publicaciones, y en el diseño de publicación única del sitio web tenemos un widget que muestra las N publicaciones relacionadas de la categoría en la que se encuentra la publicación actual. Como era de esperar, esta consulta compleja tomará algún tiempo para tomar el resultado de la base de datos y mostrarlo en el sitio web.

Ahora imagina que tienes 10 000 usuarios que acceden al sitio web al mismo tiempo. Esto significa que tendremos más de 10,000 solicitudes de bases de datos que tienen que hacer la consulta (esta es una consulta compleja ya que buscaría a través de las tablas wp_terms, wp_term_relationships, wp_term_taxonomy, wp_posts , por lo que son más de 10,000 consultas), para obtener la resultado para las N publicaciones de la categoría relacionada y mostrarlas en la interfaz. Esto, a su vez, sobrecargaría la base de datos y retrasaría el tiempo de carga general del sitio web y, en algunos casos, incluso lo bloquearía debido a la sobrecarga de la base de datos.

Y aquí surge la pregunta de cómo podemos optimizar y reducir el número de consultas y solicitudes de bases de datos. ¿Por qué tener tantas consultas cada vez cuando podemos aprovechar la API de transitorios y simplemente almacenar en caché el objeto de consulta o en caché toda la salida HTML? De esta manera, reduciremos y optimizaremos la cantidad de consultas a la base de datos, lo que conducirá a un mejor rendimiento del sitio web y una mejor experiencia del usuario.

En nuestro caso, las consultas buscarán en las tablas wp_terms, wp_term_relationships, wp_term_taxonomy, wp_posts para obtener todos los resultados esperados.

Aquí hay un ejemplo completo de cómo podemos lograr esto:

 function show_posts_from_category () {
$ args = matriz (
'cat' => 555, // ID de categoría aleatoria
'posts_per_page' => 8, // Número aleatorio de publicaciones relacionadas para mostrar
'No_found_rows' => cierto,
);

$ hash = md5 ($ args ['gato']); // Hash MD5 del ID de categoría
$ transient_key = 'categoría-'. $ hash; // Clave transitoria

if (false === ($ posts_from_category_html = get_transient ($ transient_key))): // Transient fue caducado / no se ha configurado

$ the_query = new WP_Query ($ args); // Obtener la consulta

ob_start (); // Activar el búfer de salida

while ($ the_query-> have_posts ()): $ the_query-> the_post ();
?>
<div class = "elemento">
<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
end while;

$ post_from_category_html = ob_get_contents (); // Obtiene el contenido del búfer de salida sin borrarlo
ob_end_clean (); // Desactiva este búfer de salida

set_transient ($ transient_key, $ posts_from_category_html, $ transient_expire = 15 * MINUTE_IN_SECONDS); // Establecer el transitorio con un tiempo de vencimiento de 15 minutos

wp_reset_postdata ();
terminara si;

return $ post_from_category_html;
}

Pensamientos finales

El almacenamiento en caché es una excelente manera de acelerar las cosas, pero debe saber exactamente qué está almacenando en caché, dónde puede hacerlo, cuándo y cómo; de lo contrario, corre el riesgo de enfrentar consecuencias inesperadas.

Si no está seguro de si algo está funcionando según lo previsto, siempre recurra a la creación de perfiles: observe cada consulta en la base de datos, observe todas las llamadas a funciones PHP, el tiempo y el uso de memoria.

Transients API es una excelente manera de optimizar el tiempo de carga de su sitio web de WordPress y ofrecer una experiencia de usuario excepcional. Usar transitorios en sus complementos y temas es simple y solo agrega algunas líneas adicionales de código. Cuando se usa en las situaciones adecuadas, como consultas largas de bases de datos o datos procesados ​​complejos, puede ahorrar segundos en los tiempos de carga en su sitio.