Cacheando y acelerando con Redis, parte III
Publicado 14-09-2014
En esta parte veremos brevemente como utilizar Redis desde PHP. No te pierdas todas las partes de la serie sobre Redis: Parte I, Parte II, y Parte III.
No vamos a hacer una web ni a utilizar ningún framework, manteniendo el foco en Redis, pero veréis que es fácil adaptarlo a vuestros programas.
PHP desde la consola
En primer lugar veamos como utilizar PHP desde la consola. Cread y editad el fichero prueba-redis.php
, con el siguiente contenido:
Si nos fijamos en la primera línea #!/usr/bin/env php
veremos que le estamos diciendo al shell como debe procesar este fichero, con el intérprete de PHP.
Otra cosa a observar y que mucha gente no sabe es que no hay que cerrar los tags de script de PHP, es decir, basta con abrir el programa con <?php
y no cerrarlo nunca, de hecho es el estándar de codificación recomendado y así nunca nos encontraremos con el problema de que un carácter perdido después del cierre dé al traste con toda la salida web.
Esto, por supuesto, si no estamos haciendo spaghetti code, pero eso ya es motivo de otro artículo.
Ahora daremos permiso de ejecución a nuestro script:
1root# chmod +x prueba-redis.php
Lo ejecutamos:
¡Correcto! Ya sabemos utilizar PHP desde la consola. Ahora veamos como se llama al Redis que ya instalamos anteriormente.
Redis desde PHP
Instalando la extensión
En primer lugar tendremos que instalar el gestor de extensiones pear y el paquete php5-dev:
1root# apt-get install php-pear php5-dev
Ahora buscaremos la extensión de redis:
La instalamos:
Haremos lo que nos pide y añadiremos la extensión en /etc/php5/cli/php.ini
. Nótese que lo añadimos en el ini del directorio cli porque es el fichero ini que se utiliza en php de línea de comandos, para el servidor web utilizaremos el de php-fpm o el de apache.
1; extension=modulename.extension 2; For example, on Windows: 3; extension=msql.dll 4; ... or under UNIX: 5; extension=msql.so 6; ... or with a path: 7; extension=/path/to/extension/msql.so 8; If you only provide the name of the extension, PHP will look for it in its 9; default extension directory. 10 11; Esta última línea es lo único que hay que añadir: 12extension=redis.so
Utilización
Encontraremos más información sobre la extensión en su página en PECL y en el readme del repositorio.
De momento vamos a editar el script de antes y vamos a hacer que escriba y lea un valor, lo modificaremos para dejar el siguiente contenido:
1#!/usr/bin/env php 2<?php 3 4# Redis connection 5echo "\nConectando con Redis...\n"; 6$redis = new Redis(); 7$redis->connect('127.0.0.1'); 8 9# Save a value 10echo "Guardando key prueba-php...\n"; 11$redis->set('prueba-php', "Esto es una prueba a las ".date('H:i:s')." horas."); 12 13# Retrieve value 14echo "Recuperando valor: "; 15echo $redis->get('prueba-php')."\n"; 16 17echo "FIN\n";
Probemos a ejecutarlo con ./prueba-redis.php
:
¡Correcto! Cada vez que lo ejecutemos aparecerá la una hora distinta, porque acabamos de escribirla en el set
.
Os recomiendo hacer pruebas como guardar un array, un objeto serializado, un JSON, incrementar una variable… pero en definitiva no deja de ser así de sencillo.
Ideas
Gestor de sesiones
Preparar un gestor de sesiones (session handler) para que todas las sesiones vayan a Redis en lugar de a disco o base de datos. En sitios de mucha carga puede ser fundamental.
Estadísticas
Almacenar el número de clicks de una descarga de mi web en un incremental de Redis, cuando sean 50 ponerlo a 0 y sumar 50 en el registro oportuno de MySQL. Me habré ahorrado 49 UPDATE.
Plantillas
En lugar de generar cada vez el HTML de mis plantillas de smarty o twig, ver que partes no cambian y guardar los parciales en Redis para soltarlos directamente de RAM. Si hace falta les puedo poner una caducidad de 1 hora, o de 1 día.
Más ideas
Esperamos vuestras ideas y comentarios sobre Redis. Un saludo.