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:

1#!/usr/bin/env php
2<?php
3
4echo "Hello World!";
5

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:

1»» ./prueba-redis.php
2Hello World!

¡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:

1root# pecl search redis
2
3Retrieving data...0%
4Matched packages, channel pecl.php.net:
5=======================================
6Package Stable/(Latest) Local
7redis   2.2.5 (stable)        PHP extension for interfacing with Redis

La instalamos:

1root# pecl install redis
2[... instalación ...]
3Build process completed successfully
4Installing '/usr/lib/php5/20100525+lfs/redis.so'
5install ok: channel://pecl.php.net/redis-2.2.5
6configuration option "php_ini" is not set to php.ini location
7You should add "extension=redis.so" to php.ini

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:

1root# ./prueba-redis.php
2
3Conectando con Redis...
4Guardando key prueba-php...
5Recuperando valor: Esto es una prueba a las 18:06:52 horas.
6FIN

¡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.

Comentarios por Disqus