En Laravel disponemos de una herramienta muy útil a la hora de optimizar el tiempo de carga de los datos en nuestra aplicación por medio de un almacenamiento temporal, se trata del uso de «Cache«, el cual es un feature con el que podremos acceder a todos los servicios de caché que ofrece el framework.
En informática, la caché es la memoria de acceso rápido de una computadora, que guarda temporalmente los datos recientemente procesados (información).
¿Qué quiere decir esto? bien, lo que te permite Cache es almacenar variables u objetos en una memoria temporal y acceder a ellos mientras estén disponibles. Esto es una gran ventaja cuando estás desarrollando aplicaciones que hacen uso de API’s para mostrar o incluir información de un recurso externo, de tal manera que puedes hacer la petición una sola vez cada cierto tiempo (una hora, 10 horas, un día, etc) y usar posteriormente la data almacenada de forma local sin tener que realizar una petición externa cada vez que quieras acceder a la información.
Configuración
Las opciones de configuración de caché de nuestros proyectos de Laravel se encuentran en el directorio config/cache.php. Actualmente el framework soporta servicios como memcache, redis, e inclusive base de datos (mysql, sqlite,etc.) para almacenar la caché de cada aplicación, pero esto sería un tema un poco más avanzado. Afortunadamente también tenemos una opción más sencilla que es el uso de un archivo de cache, de esta forma todas las variables y objetos se almacenan de forma local dentro del directorio storage/cache.
Esta última opción viene definida por defecto en la configuración, dentro del archivo config/cache.php:
'default' => env('CACHE_DRIVER', 'file'),
Para activar esta opción debemos ejecutar desde la consola:
$ php artisan config:cache
Guardando elementos en caché
Una vez configurada nuestra aplicación podemos comenzar a almacenar valores en caché usando:
\Cache::put('foo','bar', 10);
put es el método que nos permite guardar elementos, los argumentos que recibe son: el nombre de la variable a almacenar, el valor de dicha variable (u objeto) y por último el tiempo (en minutos) que estará almacenado dicho valor en la memoria temporal.
También puedes enviar en lugar de los minutos, una instancia de DateTime (PHP) para indicar el momento en el que debe expirar dicha variable.
Recuperar elementos de la caché
Puedes acceder a las variables almacenadas en la memoria temporal con:
\Cache::get('foo'); //devuelve 'bar'
Eliminar elementos de la caché
Si deseas eliminar un solo elemento basta con usar:
\Cache::forget('foo');
Pero si en lugar de eliminar no sólo un elemento sino todos los elementos almacenados puedes usar:
\Cache:flush();
Aplicación
Vamos a crear una petición de búsqueda a la API de Google con la finalidad de almacenar el objeto obtenido como respuesta en la caché del proyecto.
Iniciamos creando un nuevo controlador:
$ php artisan make:controller SearchController --plain
Posteriormente, editamos el archivo de rutas agregando la siguiente línea:
Route::get('search', 'SearchController@search');
Ahora editamos un poco nuestro controlador:
public function search() { // Cadena de texto a buscar en Google $query = 'styde.net'; $url = "http://ajax.googleapis.com/ajax/services/search/web?v=1.0&q=".$query; $body = file_get_contents($url); $json = json_decode($body); //imprimimos en pantalla el objeto dd($json); }
Perfecto, si ingresamos a la url /search veremos lo siguiente:
Como puedes ver, funciona, pero el problema ocurre si necesitamos hacer esta petición de forma recurrente, entonces puede ser un gran desperdicio de recursos solicitar la misma información una y otra vez; después de todo la información no se actualiza a cada segundo, pero tal vez unos 20 minutos entre cada actualización sea suficiente. Para ello, modificamos el controlador de la siguiente manera:
public function search() { // Cadena de texto a buscar en google $query = 'styde.net'; $url = "http://ajax.googleapis.com/ajax/services/search/web?v=1.0&q=".$query; $body = file_get_contents($url); $json = json_decode($body); // Agregamos el objeto a la caché del proyecto \Cache::put('search', $json, 20); //imprimimos en pantalla el objeto obtenido desde la caché dd(\Cache::get('search')); }
Si ingresamos nuevamente a la url veremos el mismo resultado:
Parece que funciona pero esto no está del todo bien, porque de esta forma estamos haciendo la petición cada vez que actualizamos la página y almacenamos cada vez un nuevo valor. Vamos a solucionarlo utilizando el método ::has() que permite evaluar si una llave existe en la caché:
public function search() { // Si la variable no existe la creamos if (!\Cache::has('search')) { // Cadena de texto a buscar en google $query = 'styde.net'; $url = "http://ajax.googleapis.com/ajax/services/search/web?v=1.0&q=".$query; $body = file_get_contents($url); $json = json_decode($body); \Cache::put('search', $json, 20); } //imprimimos en pantalla el objeto dd(\Cache::get('search')); }
Con este pequeño cambio estamos preguntando si la variable no existe (bien sea porque no se ha creado o porque haya expirado), de ser así la creamos en la caché y devolvemos el resultado.
Espero que te haya gustado este tutorial, recuerda dejar tus dudas en la sección de comentarios y compartir el contenido en redes sociales.
Material recomendado
- Laravel desde cero
- Curso introductorio de Laravel 5.1
- Autorización y políticas de acceso en Laravel 5.1
Regístrate hoy en Styde y obtén acceso a todo nuestro contenido.
Lección anterior Autorización y políticas de acceso en Laravel 5.1 Lección siguiente Modificando migraciones en Laravel