Optimización de PHP sin tocar código

Sí, título amarillista 😀 pero es real, se puede conseguir una gran mejora del rendimiento en aplicaciones PHP de las que para efectos prácticos no nos va a interesar si están bien o mal diseñadas, sino que supondremos que se requiere mejorar su rendimiento sin incrementar los recursos de hardware.
Voy a poner el ejemplo de este blog, en la noche de ayer decidí que andaba algo lento y quería mejorar su rendimiento y velocidad de respuesta, así que el plan era conseguir la optimización de PHP sin hacer mayores cambios, por lo que verifiqué que en el servidor donde estaba hosteado estuviera instalado y activado eaccelerator (porque a decir verdad, hoy en día no puedes hostearte en ningún sitio donde no te provean al menos opcode cache y en unwebparatodos lo hacemos).
En resumen pasé de 2.3seg a 814ms como respuesta de la portada de este blog. Antes de empezar es importante entender que la carga de la que estamos intentando optimizar es la relacionada con la respuesta de php y no la descarga de contenido que puede variar si utilizas imágenes o contenido multimedia en general (entre otras cosas) por lo que esos 814ms son los que le toma a un usuario descargar los contenidos de esta portada, el renderizarlo en su navegador puede tomarle más, depende de su máquina, recursos, etc, en general de 1 a 2 segundos. Ahora sí, como lo logramos:
Primero contar con opcode cache, esto lo conseguimos con eaccelerator; para entender lo que hace, nos remitimos de forma básica a como se ejecuta un script PHP.
PHP es un lenguaje de programación de script, esto es, no se lleva a lenguaje de máquina como los programas a los que estás acostumbrado, sino que se queda en su forma de código fuente un archivo de texto plano con extensión .php, así que podrás leer el contenido del programa sin necesidad de ejecutarlo, por ejemplo un programa que muestre “Hola Mundo” en php solo deberá incluir la línea: <?php echo “Hola Mundo”; ?> y con eso bastará. Bueno, al ejecutarlo y para que funcione, si que debe estar en lenguaje de máquina, sino, la máquina no hará nada; sucede que para el caso de PHP es en tiempo de ejecución cuando se compila y se muestra el resultado, es decir se compilará cuando se le necesite y cada vez que se le necesite, a este resultado le llamamos opcode (o código de operación), el problema es que cada vez que se ejecute una pieza de software se volverá a realizar el proceso y usualmente los programas incluyen más que solo un “hola mundo”, así que nos conviene guardar ese código de operación para la próxima vez que se ejecute el script nos ahorremos esta parte del proceso.
Visto lo anterior, eaccelerator se encarga de conservar una cache de todo el opcode y la elimina si el archivo original cambia para conservar el nuevo resultado (así no se dan problemas por archivos no sincronizados). Aquí un manual para implementar eaccelerator.
El proceso de ejecución de scripts PHP no termina en la generación del opcode porque como debes estimar, el opcode es apenas el pequeño código por cada operación, así que para presentar el resultado final, se realizan operaciones y consultas a la(s) base(s) de datos, al final se crean los contenidos al vuelo.
Con opcode cache nos estamos ahorrando una porción del tiempo de ejecución, aún nos resta una parte muy importante. Sucede que gestores de contenido como Joomla o WordPress (con plugin adicional) nos proveen formas de conservar estas respuestas finales en una cache de nivel superior y así obtener mejores tiempos pues a la larga no estaríamos ejecutando php más que para verificar si ya la respuesta existe y no para ejecutar todo el proceso.
Con Joomla basta con activar la chache desde el administrador, en WordPress con instalar y configurar el plugin w3 Total cache puedes obtener grandes mejoras. aquí un limitante más, sucede que estas soluciones guardan el contenido de la cache en el disco duro y aunque cuentes con un SSD aún no se compara con la velocidad de respuesta que ofrece la RAM, pues para eso está memcached, un servidor de cache que por suerte funciona con PHP. Aquí un manual para instalar memcached en tu servidor.
Quiero añadir que con CentOS 6 no me funcionó tan bien mi tutorial, así que te invito a revisarlo y a aplicar los siguientes pasos:
yum install libevent memcached memcached-devel libmemcached-devel
wget http://pecl.php.net/get/memcache
tar zxvf memcache
cd memcache-3.0.8
/usr/bin/phpize
./configure
make
make install
chkconfig memcached on

Luego ver y editar el archivo de configuración para cambiarlo según tu requerimiento: vim /etc/sysconfig/memcached
PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="64"
OPTIONS=""

Ten presente que MAXCONN es la cantidad de conexiones que gestionará memcached y CACHESIZE es el tamaño de la memoria cache en MB.
Y por último:
service memcached restart
memcached-tool localhost:11211 display