Header Ads Widget

Ticker

6/recent/ticker-posts

Tutorial de caché de Laravel

 



Dediquemos un momento a hablar sobre el caché. Ahora, cuando decimos caché, no estamos hablando de billetes de un dólar, ¡aunque eso es lo que parece! El almacenamiento en caché es el acto de almacenar datos de forma transparente para su uso futuro en un intento de hacer que las aplicaciones se ejecuten más rápido. Hay todo tipo de formas de almacenar datos en caché, y Laravel facilita hacerlo con solo una pequeña cantidad de llamadas a métodos. Una vez que tenga una aplicación en funcionamiento, estará listo para ajustarla a la perfección, y el manejo del almacenamiento en caché de datos es parte de ese proceso. ¡Saltemos!


Configuración de caché de Laravel

Lo primero que podemos hacer es echar un vistazo a dónde se encuentran las opciones de configuración para el almacenamiento en caché en Laravel. Eso estaría en app/config/cache.phpMi archivo de configuración se ve así:

cache.php

En primer lugar, podemos ver que hay muchas opciones sobre cómo realmente desea manejar el almacenamiento en caché. En otras palabras, puede elegir qué controlador usar para manejar el caché. Por defecto está configurado para file, sin embargo cualquiera de las siguientes son compatibles: databaseapcmemcachedredis, y array.

A continuación, se especifica la ruta hacia donde se almacenarán los datos de la caché. Fuera de la caja, los datos de su caché se ubicarán en app/storage/cachey esto funcionará bien para la mayoría de los escenarios. Las opciones de configuración restantes tratan con escenarios en los que podría estar usando una base de datos para almacenar los datos de la caché o una opción de memcached.


Ejemplo de caché de Larvel

Como muchos de nuestros otros tutoriales, una excelente manera de probar algunas funciones en Laravel es simplemente crear algunos ejemplos en la ruta de inicio de su routes.phparchivo.

Caché :: put ()

El primer método que veremos es el método Cache :: put () . Se necesitan tres parámetros, que son una clave, un valor y un tiempo en minutos, para almacenar en caché los datos. Probémoslo dando una clave de cachekey, un valor de I am in the cache baby!y un tiempo de almacenamiento de 1minutos:

Continúe y cargue su página de inicio. Ahora, si esperamos que sucedan cosas realmente emocionantes al cargar esa ruta, me disculpo, ya que probablemente solo esté mirando una página en blanco. Sin embargo, lo que este ejemplo hizo por nosotros fue crear nuevos datos de caché en la app/storage/cachecarpeta. En nuestra instalación, creó algunas subcarpetas y el archivo de datos resultante se parece a 773d6310cb469462e79d0f7ff0a55840 dentro de la carpeta app / storage / cache . Al abrir ese archivo, podemos ver los datos que se han almacenado en caché: 1406759615s: 23: "¡Estoy en el caché, bebé!";

Caché :: get ()

De acuerdo, ha almacenado algunos datos en la caché y está listo para recuperarlos ahora en lugar de atascar toda su aplicación. ¿Cómo puedes recuperar esos datos? Es bastante fácil saltamontes joven. Simplemente saque su Cache::get()método y pásele la clave del caché que está tratando de recuperar así:

Carga la página de inicio y como por arte de magia, ¡estoy en el caché bebé! es regresado. ¡Increíble! Es posible que haya notado que solo almacenamos nuestros datos durante 1 minuto. Eso no es mucho. ¿Qué sucede si intentamos obtener datos de la caché después de que se ha ido? Bueno, en ese caso, puede proporcionar un segundo parámetro al método Cache :: get () para que se proporcione un valor predeterminado. Por ejemplo:

Digamos que carga la página de inicio 30 segundos más tarde. Bueno, en ese caso, los datos de su caché todavía están allí y descubren que estoy en el caché, ¡bebé! , sin embargo, si carga la página unos minutos más tarde, la caché caducará. En ese caso, nuestro valor predeterminado será devuelto. La caché está vacía, así que aquí hay algo para que esté contento .

Muy buena implementación en la parte de Laravels si lo digo yo mismo. Si alguna vez ha tenido que crear un mecanismo de almacenamiento en caché a mano en cualquiera de sus aplicaciones que no son del marco, seguramente podrá apreciar la simplicidad de este enfoque.

Caché :: para siempre ()

Este método es para almacenar datos en la caché y solo desea que estén disponibles para el usuario, sin especificar un tiempo para el almacenamiento. Vea un ejemplo de cómo utilizar este método de caché para resaltar contenido nuevoEso podría verse algo como:

Caché :: has ()

Este método es útil para verificar si el caché tiene la clave que está buscando. Es casi como buscar una entrada en una base de datos antes de devolverla. Con este enfoque, podemos verificar el caché para ver si tiene lo que queremos, luego devolverlo así:

Caché :: olvidar ()

Si decide usarlo Cache::forever(), sería bueno tener una forma de eliminar esa clave del caché. Puedes hacer esto Cache::forget()así:

Entonces, lo que sucede aquí es que cachekeyse elimina de la caché, los ifhallazgos que cachekeyya no están allí y nos devuelven con la clave de caché de datos que se olvidó, por lo que estos son solo datos aleatorios


Almacenamiento en caché de base de datos con Laravel

Una de las cosas más útiles para almacenar en caché son las solicitudes de base de datos. La memoria de la base de datos es escasa cuando aloja su aplicación con muchos de los servicios de alojamiento web más populares de la actualidad. Se quedará sin capacidad de procesamiento de la base de datos antes de que se agoten los ciclos de la CPU web. Al almacenar en caché los resultados de su base de datos, puede conservar algunos de esos recursos de su base de datos, sin mencionar la velocidad de respuesta de sus aplicaciones. Veamos cómo funciona esto.

Modelo :: recordar ()

Cuando usamos elocuente para recuperar información de la base de datos, podemos hacer uso de un método especial llamado recordar () para almacenar en caché los resultados de nuestra consulta durante un período de tiempo específico. Observemos el siguiente código:

En el código anterior, hemos agregado un fragmento especial para que podamos ver las consultas que elocuente crea para nosotros. Cada vez que se realiza una llamada a la base de datos, ya que estamos escuchando illuminate.query, veremos el SQL real. Esta es una característica fantástica y funciona como una forma de perfilar su aplicación.

Observe que estamos usando el modelo de usuario para obtener algunos datos de la base de datos. ¡Fíjate en ese remember()método que nos colamos allí mismo! Este método toma un valor numérico que especifica la cantidad de minutos para almacenar en caché el resultado de la consulta de su base de datos. En este ejemplo, solo lo almacenamos en caché durante un minuto, pero eso es solo para que podamos demostrar cómo funciona. Cuando visitamos la página de inicio, si la consulta de la base de datos no está almacenada en caché, el SQL se mostrará en la pantalla. Si la consulta se almacena en caché, los datos simplemente se extraerán de la caché y no verá la consulta. Observe cómo funciona esto:


Carga de página inicial
ejemplo de caché de laravel


Carga de página 30 segundos después
caché de la base de datos laravel


La segunda vez que se carga la página, no vemos ningún SQL. Esto significa que los datos provienen directamente de la caché en lugar de la base de datos. ¡Épico!


Salida de caché de Laravel

Ahora tenemos una comprensión rudimentaria de cómo funciona el almacenamiento en caché en Laravel. Ahora que entendemos cómo almacenar en caché con pares clave-valor, así como almacenar en caché los hits de la base de datos remember(), veamos cómo podemos configurar el almacenamiento en caché de salida HTML completo en Laravel.

Filtros de ruta de caché de Laravel

Al configurar filtros de ruta en Laravel, podemos lograr ese objetivo de almacenar en caché toda la salida HTML. Podemos hacer uso de filtros de ruta antes y después para manejar la recuperación o configuración de la caché. Aquí hay un ejemplo de cómo configuraría un filtro de ruta Jane simple directamente en su routes.phparchivo:

Este pequeño fragmento registra primero un filtro especificando el nombre del filtro, en este caso routename, y luego un cierre que acepta los parámetros de $route$request, y $response$route$requestson obligatorios para antes de los filtros, mientras que $route$requesty $response se requieren para después de filtros. Dentro del cierre, puedes hacer la lógica que quieras. En este caso, regresaremos antes de que se ejecute la ruta para fines de demostración. Podemos activar ese filtro simplemente agregando ->before('routename')al final de la ruta a la que queremos aplicarlo. Entonces, en este caso, cuando visitemos la ruta de la página de inicio, simplemente veremos que vengo antes de que se ejecute la ruta. en lugar de los datos devueltos desde la base de datos.

Cree su propia clase de filtro

Si prefiere crear su propia clase para contener su lógica de filtro, en lugar de usar cierres para manejar los filtros de ruta, puede hacerlo. En este ejemplo, queremos configurar un filtro para antes y después de la ruta. Nuestro objetivo es crear esta clase para que cuando visite una ruta, Laravel primero verifique si el HTML resultante para esa ruta se ha servido recientemente. Si es así, devuelva ese HTML de la cachéTambién queremos asegurarnos de que cuando un usuario visita esta ruta, si no hay caché presente, Laravel completará el trabajo duro de acceder a la base de datos, devolver esos datos, representar una vista y entregar esta respuesta al navegador. También queremos asegurarnos de que cuando ocurra todo este proceso, estos datos de respuesta se coloquen primero en la caché antes de ser presentados al usuario. De esa forma, estos datos estarán disponibles en la caché para futuras solicitudes. ¡Excelente! Podemos manejar la primera parte de esto, verificando la caché , en un filtro antes . Podemos manejar la escritura en la caché con un filtro posterior . Supongamos que ya creamos todo el código de backend para manejar esto, ¿cómo sería nuestro archivo de rutas?

  • 1: Determine cómo le gustaría llamar a sus filtros

  • Trabajaremos al revés en este ejemplo. Veamos cómo configuraríamos nuestro archivo de rutas para que podamos pensar en cómo nos gustaría llamar a estos filtros para manejar la obtención y configuración de los resultados de la caché por nosotros.

    rutas.php

    Observe que hemos encadenado un filtro antes y un filtro posterior a la ruta de inicio agregando ->before('cache.grab')->after('cache.set')Dejamos el detector de eventos en su lugar para simplemente mostrarnos cuándo obtenemos datos de la caché en lugar de cuándo obtenemos datos que se generan sobre la marcha para nosotros. Recuerde que cuando los datos provienen de la caché, no habrá ningún SQL volcado a la pantalla, mientras que si hay un acierto en la base de datos, veremos el SQL mostrado. Además, observe la convención de cache.grabcache.setUsamos la notación de puntos para recordarnos que agarrar y configurar serán métodos definidos en una clase dedicada y resueltos fuera del contenedor de IoC .

  • 2: Registre los nombres de los filtros con el contenedor de IoC

  • Ahora que sabemos que nos gustaría tener un filtro de antes cache.graby un filtro de después cache.set, podemos configurar nuestro registro con el IoC. Abra app/filters.phpy agregue este código al final del archivo para hacer precisamente eso. Tenga en cuenta que los comentarios también los hacemos nosotros, por lo que también puede agregarlos.

    Estas dos líneas simplemente asignan nuestros dos nuevos nombres de filtro a llamadas a métodos dentro del laratutFiltersespacio de nombres en una clase CacheFilter.

  • 3: Crea tu clase de caché

  • El último paso para que esto funcione es crear la clase que hará el trabajo por nosotros. En nuestro caso, creamos CacheFilter.php en el laratutFiltersespacio de nombres. Nota: Ya habíamos configurado este espacio de nombres de una lección anterior y composer dumpya se había ejecutado para este espacio de nombres. Esto significa que nuestros archivos se cargarán automáticamente sin problemas, pero si está creando esta lección desde cero, es posible que deba agregar el espacio de nombres a su composer.jsony ejecutar composer dump.

    CacheFilter.php

Entonces, ¿cómo funciona esta clase? Examinemos todo el flujo de este código y lo entenderemos mejor. Cuando un usuario visita la ruta de origen, cache.grabse llamará al filtro antes de que se cargue la solicitud. Esto activará el grabmétodo en la clase CacheFilter . Este método hace lo siguiente:

  1. Crea una clave basada en la URL de la ruta
  2. Usa esta clave para verificar el caché
  3. Si esta clave ya existe en el caché, simplemente podemos devolver esos datos en caché

En este punto, si la página proviene de la caché, simplemente se mostrará en el navegador. Por otro lado, si cache.grabno hace nada ya que no había una clave en el caché, Laravel hará lo que normalmente hace cuando visitas una ruta. Consultará la base de datos, representará una vista, filtrará los datos de la vista, etc. El usuario obtendrá el resultado esperado en el navegador. Una vez que este proceso se realiza, el después del filtro de cache.setentonces se disparará. Este setmétodo hace lo siguiente por nosotros:

  1. Crea una clave basada en la URL de la ruta
  2. Usa esta clave para verificar el caché
  3. Si esta clave no existe , escriba la respuesta en la caché usando esta clave

Si lo probamos en el navegador, ¡parece que funciona!


Carga de página inicial
ejemplo de caché de laravel


Carga de página 30 segundos después
caché de la base de datos laravel


Además de esto, si buscamos en la app/storage/cachecarpeta, podemos encontrar un archivo que sí contiene el contenido HTML completo. Estos datos fueron almacenados en caché por nuestro setmétodo.

La conclusión de la caché

Este fue un curso intensivo fantástico para ponerse al día con el almacenamiento en caché en una aplicación Laravel. Al hacer uso de Cache :: put () , Cache :: get () , Cache :: has () , Cache :: forever () y los otros métodos de almacenamiento en caché disponibles, podemos obtener y configurar el caché en cualquier número de formas. También vimos cómo podemos registrar filtros de ruta y crear una clase de almacenamiento en caché dedicada para encargarse de esto por nosotros.

Publicar un comentario

0 Comentarios