22 marzo 2018

Conoce las cachés de Wordpress


La memoria caché es un tipo de memoria intermedia que se utiliza para acelerar la ejecución de algunos procesos. Su uso es muy extenso: la idea es simple, acercar los datos al usuario de manera que la próxima vez que se necesiten estén a disposición. Así, existen cachés tanto a nivel de hardware (dentro del procesador), como software (por ejemplo, las cachés de páginas de los navegadores).

Wordpress también hace uso de cachés. En este caso los desarrolladores de WP tenemos a nuestra disposición dos cachés diferentes, según necesidades: la WP Object Cache y la Transients API.

WP Object Cache

La WP Object Cache es una caché en memoria. Su tiempo de vida es muy bajo: sólo dura una petición. Es decir, la caché existe mientras se está procesando una petición y se construye una página. Lo positivo es que al quedar en memoria es muy rápida. Está pensada para disminuir los accesos a base de datos. Así, si realizamos una consulta SQL y guardamos el resultado en la WP Object Cache, podemos recuperar posteriormente el mismo resultado y así evitarnos un nuevo acceso a la base de datos. Eso sí, siempre que estemos en la misma petición

Un ejemplo de uso sería el seguiente:

$result = wp_cache_get('resultado_de_consulta');
if ($result === false) {
    $sql = 'SELECT ....'; // Consulta compleja que requiere de tiempo
    $result = $wpdb->get_results($sql);
    wp_cache_set('resultado_de_consulta', $result);
}

En el anterior ejemplo vemos como recuperar un elemento de la caché y, si no se encuentra, realizar la consulta a la BD y dejarlo en caché para un acceso posterior. Es importante tener en cuenta que el identificador con el que asociamos el item de la caché ha de ser único. Para ello, una recomendación es usar como prefijo el nombre de nuestro plugin.

Como ya hemos dicho, esta caché sólo sirve durante el proceso de una petición. ¿Qué pasa si necesitamos una caché que tenga una vida mayor? Sigamos....

Transients API

La Transients API es la solución que Wordpress nos ofrece para tener cachés que van más allá de la generación de una página. Por ejemplo, si tenemos una web con un ritmo de modificación bajo, nos puede interesar mantener en caché ciertos elementos comunes para así acelerar la generación de cada página. Esos elementos pueden ser: listas de categorías, de tags, de entradas, etc

Para conseguir esta "supervivencia", la Transients API usa la base de datos de Wordpress (concretamente, la tabla `options`), para poder mantener los datos más allá de una petición.

Además de la persistencia en base de datos, la Transients API añade otra característica: el tiempo de expiración. Cuando se guarda un elemento en la caché Transients, se puede indicar un tiempo (en segundos), que será el tiempo máximo que ese elemento estará en caché. Una vez superado el tiempo, el elemento de la caché no será válido.

La Transients API tiene dos funciones que permiten el acceso a la cache: get_transient() y set_transient(). A continuación se puede ver un ejemplo de su uso:

$cacheKey = $this->pluginName . '_tags';
$tags = get_transient($cacheKey);
if ($tags === FALSE) {
 	$tags = get_tags_from_db();
   	set_transient($cacheKey, $tags, 2 * HOUR_IN_SECONDS); // 2 hours
}
return $tags;

En el anterior ejemplo se observa el uso de las dos funciones. Si los datos no se encuentran en caché (get_transient() devuelve FALSE), es necesario obtener los datos de la base de datos y guardarlos en caché, vía set_transient(). Wordpress ofrece un conjunto de constantes para facilitar la conversión entre unidades de tiempo. En el caso del ejemplo se usa HOUR_IN_SECONDS que representa el número de segundos que tiene una hora.


Referencias