Tag : php

APC y la cache de usuario

En un artículo anterior comentaba sobre el uso de APC para optimizar el rendimiento de los scripts PHP, de forma totalmente automática, sin modificar la programación. En ese caso APC se encargaba de almacenar una copia del bytecode de PHP para que en la próxima ejecución no fuese necesario interpretar de nuevo el código fuente.

Pero esa no es la única utilidad de APC, también se puede utilizar para almacenar en memoria por un tiempo determinado los datos que el programador desee. Este sistema es ideal para aplicaciones con mucha carga de base de datos ya que permite almacenar ciertos datos en memoria y aliviar la base de datos del sistema y por lo tanto, el disco duro (suponiendo que todos los servicios estén en la misma máquina).

Una vez instalado APC, tal como se explica en este otro artículo, el uso de la cache de usuario es extremadamente sencillo, básicamente hay que tener en cuenta dos funciones, apc_store y apc_fetch.

La función apc_store se encarga de almacenar datos en una determinada clave. Por ejemplo:

$datos = 5;
apc_store(‘datos’,$datos,86400);

Así de sencillo, con esa instrucción los datos quedarán guardados en memoria. El primer argumento es la clave que sirve para identificar los datos guardados y poder recuperarlos más tarde. El segundo parámetro son los valores que queremos guardar, ese parámetro puede ser cualquier variable PHP, desde enteros hasta arrays y objetos. El tercer argumento es el tiempo en segundos que APC mantendrá los datos en memoria. Superado ese tiempo los datos serán automáticamente borrados de la cache.

Ahora que los datos están en memoria, queda saber cómo recuperarlos. Es más sencillo todavía, se usa la función apc_fetch:

$datos = apc_fetch(‘datos’);

A la función apc_fetch simplemente hay que pasarle la clave de los datos que queremos recuperar. Si no ha encontrado los datos devolverá “false”.

Esto puede usarse para almacenar los resultados de consultas que sean pesadas y evitar que se ejecuten una y otra vez si no es necesario. Por ejemplo, vamos a suponer que la tabla “posts” es muy grande y cuesta mucho ordenarla y filtrarla:

$posts = apc_fetch(‘posts-2010-ene-11’); // Se busca el contenido en la cache
if(!$posts) {
// Si el contenido no existe, se genera de nuevo
$posts = array();
$result = mysql_query(“SELECT * FROM posts WHERE fecha = ‘2010-01-11’ ORDER BY titulo”);
while($row = mysql_fetch_assoc($result)) $posts[] = $row;
apc_store(‘posts-2010-ene-11’,$posts,300); // Se guardan los posts en la cache durante 5 minutos
}

Eso es todo, el uso de la cache de usuario de APC es muy sencillo. Hay algunas otras funciones que se pueden ver desde http://php.net/apc

También es interesante revisar el fichero apc.php para saber cómo está trabajando la cache.

Monitorizando APC

Monitorizando APC

Acelerando PHP con Alternative PHP Cache (APC)

En estos tiempos de Web 2.0 las aplicaciones online requieren cada vez un mejor rendimiento por parte del servidor. El mundo de la optimización de aplicaciones es un tema que da mucho para hablar, hay soluciones complejas que requieren replantear gran parte del proyecto y otras que se pueden aplicar en unos pocos minutos.

Una de esas optimizaciones rápidas de aplicar es mejorar la manera en la que son ejecutadas las aplicaciones PHP, para webs desarrolladas en este lenguaje, obviamente.

Aunque PHP sea un lenguaje interpretado, es decir, que no necesitamos más que subir los ficheros .php y directamente el intérprete se encarga de ejecutarlos, sin necesidad de haberlos compilado previamente. Pero en realidad, lo que hace el intérprete es “parsear” el código, compilarlo en bytecode y por último ejecutar este bytecode. Estas operaciones se realizan una y otra vez por una petición que se hace a un script PHP. Viendo esto, sin mucho esfuerzo podemos pensar que lo más lógico sería “parsear” y compilar en bytecode el código fuente una sola vez, mantener en memoria el bytecode mientras no se modifique el código fuente y ejecutar solamente el bytecode por cada petición.

Pues bien, esto es lo que hace APC. Este sistema reserva una zona de la memoria para cachear bytecodes. Cuando llega una petición a un fichero PHP, APC revisa si ese fichero ya está en la cache, si está en cache y el fichero no se ha modificado desde la última vez que se cacheó, entonces se ejecuta el bytecode que hay en cache. Si no, APC se encargará de actualizar el bytecode en cache para que las próximas peticiones sean más rápidas.

¿Por qué APC? Hay otros sistemas que implementan el mismo concepto, algunos de ellos se pueden ver comparados en la Wikipedia, pero APC se ha convertido en el acelerador oficial de PHP, ya que va a ser integrado su desarrollo a partir de PHP 6. Además, es muy fácil de instalar como podemos comprobar a continuación.

Para instalar APC en Debian se pueden seguir los pasos siguientes. Aunque en otras distribuciones el procedimiento es muy similar.

1 – Instalamos los paquetes necesarios

# apt-get install apache2-prefork-dev php5-dev php-pear

2 – Ejecutamos pecl, el instalador de extensiones de php

# pecl install apc

3 – Modificamos el fichero /etc/php5/apache2/php.ini y añadimos al final:

extension=apc.so

4- Reiniciar apache

# /etc/init.d/apache2 restart

Listo. Para comprobar que todo ha funcionado correctamente tan solo tenemos que crear un fichero con la instrucción phpinfo(); para ver si aparece la extensión APC.

APC phpinfo

Por último, para monitorizar el funcionamiento de APC podemos copiar el script que hay en /usr/share/php/apc.php a un directorio accesible desde http y al entrar en él http://xx.xx.xx.xx/apc.php, se pueden ver varios gráficos y tablas de información con el estado de APC. También es posible modificar el archivo apc.php para indicar una contraseña y así acceder a la zona privada con algunos datos más sobre el cacheo de scripts.

Después de haber instalado el APC en algunos servidores, la impresión es que la carga se ha reducido notablemente. Es una impresión personal, ya que no he tenido tiempo de hacer mediciones más serias.