MarcosBL

Aprendiz de todo, maestro de nada

Trabajando con PHP eAccelerator

Esto es un primer intento de optimización del servidor dedicado que acabamos de contratar para la empresa, para intentar reducir los loads medios del mismo (de hasta el 6 de media y el 20 en momentos «Ã¡lgidos«. Pretendo extenderlo a una optimización de:

  • Acelerador de PHP, para tener los scripts precompilados
  • Cacheador de MySQL, para reducir el número de consultas a la BD
  • Cacheador de HTML, del HTML generado por el PHP, sea mediante algún software de plantillas o con algún método propio
  • Cualquier otra cosa que se me ocurra… porque al servidor le hace mucha, pero que mucha falta


Como seguramente sabrás (o no) PHP no es un lenguaje compilado, sino que cada vez que se realiza una petición de página, ésta se interpreta generando una estructura de datos intermedia que a continuación es ejecutada.

Es en este punto donde entran en acción diversos sistemas de caché, de forma que cuando PHP solicita abrir la página para obtener su estructura, estos sistemas le devuelven ya la estructura preparada, sin necesidad de volver a interpretarla. De esta forma se obtienen mejoras en el rendimiento del servidor y un incremento de velocidad que puede ser de 10 veces más rápido.

Para utilizar uno de estos sistemas no es necesario modificar nuestras páginas en ningún sentido, ya que se instalan como extensiones de PHP. Los sistemas más utilizados son ionCube PHP Accelerator, el Zend Optimizer, que es de pago, y principalmente el Turck MMCache, el que más me llamó la atención en principio, pero que parece haber sido abandonado.

Siguiendo las estupendas instrucciones de EsLoMas y bastante información Googleada, he conseguido ponerlo en funcionamiento en el servidor nuevo de la empresa, con impresionantes resultados.

Requerimientos y Pasos

Este ejemplo trata sobre la instalación desde los fuentes, también podemos descargas varios binarios

Para compilar este acelerador/cacheador, necesitaremos instalados en nuestra máquina los paquetes:
apache 1.3,/apache 2.0 (prefork), mod_php4/5, autoconf, automake, libtool, m4

Importante, ya que la documentación no lo indica, nambién neceitaremos, si no hemos compilado PHP desde los sources (como fue mi caso, instalación desde rpm) el paquete php-devel-loquesea, para hacernos con la utilidad PHPIZE

Paso 1 – Instalación
Descargaremos la última versión desde la web de PHPeAccelerator

Acto seguido, la descomprimimos en nuestro servidor:

bash# tar xvfzp eaccelerator-0.9.3.tar.gz
bash# cd eaccelerator-0.9.3

Una vez descomprimido el paquete con los fuentes y ya dentro de su directorio, tenemos que compilar los fuentes. Para ello debemos ejecutar los siguientes comandos, cambiando en la primera línea /usr por la ubicación real en la que tengamos instalado PHP. Por ejemplo, si lo tuviéramos instalado en “/usr/local/phpâ€?, utilizaríamos esa cadena.

bash# export PHP_PREFIX=»/usr»
bash# $PHP_PREFIX/bin/phpize
bash# ./configure –enable-eaccelerator=shared –with-php-config=$PHP_PREFIX/bin/php-config
bash# make

Una vez terminados estos pasos ya tendríamos el módulo preparado, es el momento de instalarlo.

bash# make install

Como resultado de la instalación se nos indicará en qué carpeta del servidor se ha copiado el módulo, por ejemplo:

Installing shared extensions: /usr/lib/php4

Paso 2 – Configuración

Para que los scripts PHP de nuestro servidor comiencen a cachearse es necesario configurar PHP para que utilice la extensión que hemos creado y además decirle cómo debe usarla. Para ello y antes de nada, recomiendo que si en el paso anterior el módulo no se ha ubicado dentro de la carpeta “extensionsâ€? sino dentro de alguna subcarpeta, lo movamos a ella. Conste que las rutas del ejemplo son eso… de ejemplo.

bash# mv /usr/lib/php/extensions/no-debug-non-zts-20020429/eaccelerator.so /usr/local/php4/extensions

Una vez ubicada la extensión en esa carpeta ya podemos configurarla en PHP. Para ello debemos editar el archivo php.ini, que normalmente estará ubicado en “/etc/php.iniâ€?, aunque si no lo encontramos siempre podemos ejecutar un phpinfo() para obtener su ubicación.

Ya editando el archivo, debemos buscar la sección “Dynamic Extensionsâ€? y pegar en ella las siguientes líneas:

extension=»eaccelerator.so»
eaccelerator.shm_size=»16″
eaccelerator.cache_dir=»/tmp/eaccelerator»
eaccelerator.enable=»1″
eaccelerator.optimizer=»1″
eaccelerator.check_mtime=»1″
eaccelerator.debug=»0″
eaccelerator.filter=»»
eaccelerator.shm_max=»0″
eaccelerator.shm_ttl=»0″
eaccelerator.shm_prune_period=»0″
eaccelerator.shm_only=»0″
eaccelerator.compress=»1″
eaccelerator.compress_level=»9″

No hay problema si tenemos Zend Optimizer, es compatible con él, pero si tenemos el IONCube loader instalado por algún motivo, tendremos que comentarlo para evitar su carga, ya que dicho IONCube considera a nuestro PHPeAccelerator como de «poca confianza»

Deberemos asegurarnos también de que la carpeta utilizada para las extensiones coincida con la que hemos dejado el archivo eaccelerator.so, y si no es así, bien mover el archivo a la carpeta que se indique en el php.ini, o cambiar el valor de esa directiva de configuración.

extension_dir = «/usr/lib/php4/extensions/»

Paso 3 – Probando el asunto

Una vez realizados los puntos anteriores ya podemos reiniciar el servidor web y comprobar que la extensión se ha instalado correctamente. Para esto lo más sencillo será crear una página con el siguiente código y ejecutarla en el navegador:

< ?php phpinfo(); ?>

Si todo ha ido correctamente, en la caja con el logo de “Powered by ZENDâ€?, debería aparecer un texto similar a “with eAccelerator v0.9.3, Copyright (c) 2004-2004 eAccelerator, by eAcceleratorâ€?. Además si buscamos más abajo la cabecera eAccelerator veremos que nos da información varia sobre la configuración de esta extensión.

A partir de este momento todas las páginas PHP que solicitemos harán uso del acelerador.

Paso 4 – Configuración avanzada

Aparte de la forma de comprobar si la extensión está instalada que hemos visto tras la instalación, hay otro método que podemos utilizar, el cual además nos permite activar o desactivar la caché y comprobar qué scripts están en caché. Es suficiente con crear una página con el siguiente código PHP.

< ?php if (function_exists("eaccelerator")) { eaccelerator(); } else { echo "EAcceleratorEAccelerator no está instalado«;
}
?>

Sobra decir que esta página deberíamos protegerla bajo algún tipo de autenticación o mediante los valores de configuración eaccelerator.admin.name y eaccelerator.admin.password.

Para generar un usuario y contraseña válidos (y no, no vale meterlos en texto plano) , utilizaremos el siguiente script incluido con la instalación:

bash: php -q eaccelerator_password.php
Changing password for eAccelerator Web Interface (eaccelerator.php)

Enter admin name: aquituuser
New admin password: aquitupassword
Retype new admin password:aquitupassword

Con los dos valores que nos devolverá nos vamos al php.ini y los añadimos al final, mismamente.

También dispondremos de la opción de activar esta funcionalidad por dominio virtual, unos si.. otros no. Para ello lo marcaremos como desactivado por defecto en el php.ini, y lo iremos activando por dominio. Es posible hacer esto mediante los parámetros de configuración y la definición de los dominios en apache, o mediante la utilización de un archivo .htaccess.

Primero el php.ini:

eaccelerator.enable=»0″
eaccelerator.optimizer=»0″
eaccelerator.compress=»0″

Ahora ya podemos activar el acelerador independientemente para cada web, utilizando las siguientes líneas bien dentro de su sección VirtualHost en el archivo httpd.conf, o mediante un archivo .htaccess en la raiz del dominio.

php_value ‘eaccelerator.enable’ ‘1’
php_value ‘eaccelerator.optimizer’ ‘1’
php_value ‘eaccelerator.compress’ 1′

Paso 5 – Otros usos del invento

Una pega que ve mucha gente a PHP es que al ser un lenguaje interpretado, el código fuente está visible y cualquiera con acceso a los archivos puede verlo y modificarlo, por lo que en algunas situaciones puede no ser conveniente. Para evitar esta situación los fuentes de eAccelerator vienen con un programa de nombre “encoder.phpâ€? que podemos utilizar para codificar nuestros programas PHP y distribuirlos codificados. Para poder ejecutarlos sería suficiente con que el servidor disponga de eAccelerator instalado, aunque también es posible ejecutarlos sin él, mediante la instalación de la extensión eLoader que viene con los fuentes de eAccelarator. Se puede obtener más información en el archivo “README.eLoaderâ€? que viene con los fuentes.

Para obtener más información sobre como funciona el codificador se puede obtener un listado con los parámetros disponibles ejecutando php -q encoder.php

Para codificar un archivo:

php -q encoder.php -f input.php -o output.php

Para codificar una carpeta recursivamente:

php -q encoder.php -rcf input_dir -o output_dir

Paso 6 – Extendiendo a lo ancho y a lo largo

Aprovechando que el acelerador utiliza memoria intermedia para almacenar el código interpretado, dispone en su API de un conjunto de funciones que podemos utilizar para almacenar información en ella, de forma que podamos guardar resultados de funciones, trozos de texto, o el resultado completo de ejecutar una página.

En el README que viene con los fuentes encontrareis un listado donde se detalla cada una de las funciones ofrecidas en la API

Y esto es todo.. aqui queda como «copia de seguridad»

Más información

3 comentarios en “Trabajando con PHP eAccelerator

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *