Blog


Mejora el rendimiento de tu aplicación Symfony con la caché

MEJORA EL RENDIMIENTO DE TU APLICACIÓN SYMFONY CON LA CACHÉ

03 / 04 / 2023 Symfony

La caché es una técnica que se utiliza para mejorar el rendimiento y la velocidad de una aplicación web. En el caso de Symfony, esta técnica se implementa mediante el uso de varias herramientas que permiten almacenar en memoria o disco ciertos datos o recursos que son solicitados frecuentemente por la aplicación.

La caché en Symfony se puede utilizar en distintas situaciones, por ejemplo, para almacenar la salida de una acción del controlador, para almacenar datos obtenidos de una base de datos o para almacenar datos generados por una consulta compleja. A continuación, se presentan algunos ejemplos prácticos de cómo utilizar la caché en Symfony.

1. Almacenamiento en caché de la salida del controlador

Uno de los usos más comunes de la caché en Symfony es para almacenar la salida de una acción del controlador. Por ejemplo, supongamos que tenemos una acción que genera un listado de artículos para mostrar en la página principal de nuestro sitio web. Esta acción puede ser llamada muchas veces durante el día, pero los datos que se muestran en la página principal no cambian con tanta frecuencia. En este caso, podemos utilizar la caché para almacenar la salida de la acción y así evitar que se genere cada vez que se llama.

Para implementar esto, podemos utilizar el componente Cache de Symfony. Este componente proporciona una interfaz fácil de usar para trabajar con la caché en Symfony. Por ejemplo, para almacenar la salida de una acción del controlador, podemos hacer lo siguiente:

use Symfony\Component\Cache\Adapter\FilesystemAdapter;

// Crear un objeto de caché
$cache = new FilesystemAdapter();

// Obtener la clave de la caché para esta acción
$key = 'homepage_articles';

// Obtener los datos de la caché, si existen
if ($cache->has($key)) {
    $articles = $cache->get($key);
} else {
    // Si los datos no existen en la caché, generarlos y guardarlos en la caché
    $articles = generarArticulos();
    $cache->set($key, $articles);
}

// Devolver los datos
return $this->render('homepage.html.twig', ['articles' => $articles]);

En este ejemplo, utilizamos la clase FilesystemAdapter para crear un objeto de caché. Luego, generamos una clave única para esta acción (homepage_articles) y verificamos si los datos ya están en caché. Si los datos ya existen, los obtenemos de la caché. Si no existen, generamos los datos y los guardamos en la caché utilizando el método set().

2. Almacenamiento en caché de datos obtenidos de una base de datos

Otro uso común de la caché en Symfony es para almacenar datos obtenidos de una base de datos. Por ejemplo, supongamos que tenemos una aplicación que muestra información sobre productos. Cada vez que un usuario accede a la página de un producto, se realizan varias consultas a la base de datos para obtener información sobre el producto, como su nombre, descripción, precio, etc.

En este caso, podemos utilizar la caché para almacenar los datos obtenidos de la base de datos y evitar tener que realizar las mismas consultas cada vez que se accede a la página del producto. Para implementar esto, podemos utilizar el componente Doctrine de Symfony, que proporciona una funcionalidad de caché integrada.

Por ejemplo, para almacenar los datos de un producto en caché, podemos hacer lo siguiente:

use Doctrine\Common\Cache\FilesystemCache;

// Crear un objeto de caché
$cache = new FilesystemCache('/ruta/a/directorio/caché');

// Obtener la clave de la caché para este producto
$key = 'producto_'.$id;

// Obtener los datos de la caché, si existen
if ($cache->contains($key)) {
    $producto = $cache->fetch($key);
} else {
    // Si los datos no existen en la caché, obtenerlos de la base de datos y guardarlos en la caché
    $producto = $entityManager->getRepository(Producto::class)->find($id);
    $cache->save($key, $producto);
}

// Devolver los datos
return $this->render('producto.html.twig', ['producto' => $producto]);

En este ejemplo, utilizamos la clase FilesystemCache para crear un objeto de caché que almacenará los datos en un directorio en el sistema de archivos. Luego, generamos una clave única para este producto (producto_ seguido del ID del producto) y verificamos si los datos ya están en caché utilizando el método contains(). Si los datos ya existen, los obtenemos de la caché utilizando el método fetch(). Si no existen, los obtenemos de la base de datos utilizando Doctrine y los guardamos en la caché utilizando el método save().

3. Almacenamiento en caché de datos generados por una consulta compleja

Otro uso de la caché en Symfony es para almacenar datos generados por una consulta compleja. Por ejemplo, supongamos que tenemos una aplicación que muestra una lista de productos más vendidos. Para generar esta lista, necesitamos realizar una consulta compleja que involucra varias tablas de la base de datos y que puede tardar algunos segundos en ejecutarse.

En este caso, podemos utilizar la caché para almacenar los datos generados por la consulta y así evitar tener que ejecutarla cada vez que se accede a la página de productos más vendidos. Para implementar esto, podemos utilizar el componente Doctrine de Symfony junto con el componente Cache.

Por ejemplo, para almacenar los datos de los productos más vendidos en caché, podemos hacer lo siguiente:

use Doctrine\Common\Cache\FilesystemCache;

// Crear un objeto de caché
$cache = new FilesystemCache('/ruta/a/directorio/caché');

// Obtener la clave de la caché para los productos más vendidos
$key = 'productos_mas_vendidos';

// Obtener los datos de la caché, si existen
if ($cache->contains($key)) {
    $productos = $cache->fetch($key);
} else {
    // Si los datos no existen en la caché, generarlos y guardarlos en la caché
    $query = $entityManager->createQuery('SELECT p FROM App\Entity\Producto p JOIN p.ventas v GROUP BY p.id ORDER BY COUNT(v.id) DESC');
    $query->setMaxResults(10);
    $productos = $query->getResult();
    $cache->save($key, $productos);
}

// Devolver los datos
return $this->render('productos_mas_vendidos.html.twig', ['productos' => $productos]);

En este ejemplo, utilizamos la misma técnica que en el ejemplo anterior para crear un objeto de caché y generar una clave única para los productos más vendidos. Luego, verificamos si los datos ya están en caché utilizando el método contains(). Si los datos ya existen, los obtenemos de la caché utilizando el método fetch(). Si no existen, generamos los datos utilizando una consulta compleja que involucra varias tablas de la base de datos. Luego, utilizamos el método save() para almacenar los datos en la caché para futuras consultas.

Es importante tener en cuenta que, al utilizar la caché en situaciones como esta, debemos ser cuidadosos para asegurarnos de que los datos almacenados en la caché sean precisos y estén actualizados. Si los datos almacenados en la caché no son precisos o están desactualizados, esto puede llevar a resultados inesperados o incorrectos.


 



ARTÍCULOS RELACIONADOS