Scripts PHP con eAccelerator

Iniciado por ANTRAX, Febrero 24, 2010, 11:35:24 AM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

Instalación
La instalación de cualquiera de estos sistemas es equivalente y realmente sencilla. Voy a explicar cómo realizar una instalación a partir de los fuentes, aunque es posible instalar directamente los binarios.

El primer paso consiste en obtener el paquete con la última versión disponible y descomprimirlo 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.



Código: php
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.

Código: php
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:

Código: php
Installing shared extensions: /usr/lib/php/extensions/no-debug-non-zts-20020429/


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.

Código: php
bash# mv /usr/lib/php/extensions/no-debug-non-zts-20020429/eaccelerator.so /usr/local/php/lib/php/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:

Código: php
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"


Deberemos asegurarnos también de que la carpeta utilizada para las extensiones coincida con la que hemos dejado el archivo No tienes permitido ver los links. Registrarse o Entrar a mi cuenta, 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.
Código: php

extension_dir = "/usr/lib/php/extensions/"

Por último deberemos crear el directorio de caché donde se guardará el código interpretado "/tmp/eaccelerator". eAccelerator trabaja guardando la información en memoria compartida, pero en algunos casos puede ser necesario escribir la información a disco, para lo cual es necesario crear esta carpeta.

Código: php
bash# mkdir /tmp/eaccelerator
bash# chmod 0777 /tmp/eaccelerator


Probando la instalación
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:

Código: php
<?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". A partir de este momento todas las páginas PHP que solicitemos harán uso del acelerador.

En la siguiente página explico algunas posibilidades que tiene la extensión y que pueden ser de utilidad, como activar o no el acelerador por dominios, utilizarlo como codificador

Otras posibilidades

Activar la cache por dominios virtuales

En aquellos casos en los que en un mismo servidor estén alojados diversos webs, puede ser conveniente activar o no el acelerador en función de estos. Es posible hacer esto mediante los parámetros de configuración y la definición de los dominios en apache, o medienta la utilización de un archivo .htaccess.

Lo primero que deberíamos hacer es modificar la configuración por defecto para que esté inactiva, poniendo a 0 los siguientes parámetros en el archivo php.ini

Código: php
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.

Código: php
php_value 'eaccelerator.enable' '1'
php_value 'eaccelerator.optimizer' '1'
php_value 'eaccelerator.compress' 1'


Consultar el estado del acelerador

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.

Código: php
<?php
if (function_exists("eaccelerator")) {
eaccelerator();
} else {
echo "<html><head><title>EAccelerator</title></head><body><h1 align=\"center\">EAccelerator is not installed</h1></body></html>";
}
?>


Sobra decir que esta página deberíamos protegerla bajo algún tipo de autenticación o mediante los valores de configuración No tienes permitido ver los links. Registrarse o Entrar a mi cuenta y eaccelerator.admin.password.


Utilizar el acelerador como caché de páginas

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.

Este es un estracto del archivo README que viene con los fuentes, donde se detalla cada una de las funciones ofrecidas en la API:

Código: php
eaccelerator_put($key, $value, $ttl=0)
puts the $value into shard memory for $ttl seconds.

eaccelerator_get($key)
returns the value from shared memory which was stored by eaccelerator_put()
or null if it is not exists or was expired.

eaccelerator_rm($key)
removres the $key from shared memory

eaccelerator_gc()
removes all expired keys from shared memory

eaccelerator_lock($lock)
creates a lock with specified name. The lock can be released by function
eaccelerator_unlock() or automatic on the end of request.
For Example:
<?php
eaccelerator_lock("count");
eaccelerator_put("count",eaccelerator_get("count")+1));
?>

eaccelerator_unlock($lock)
release lock with specified name

eaccelerator_set_session_handlers()
install the eaccelerator session handlers.
Since PHP 4.2.0 you can install eaccelerator session handlers
in "php.ini" by "session.save_handler=eaccelerator".

eaccelerator_cache_output($key, $eval_code, $ttl=0)
caches the output of $eval_code in shared memory for $ttl seconds.
Output can be removed from cache by calling mmcach_rm() with the same $key.
For Example:
<?php eaccelerator_cache_output('test', 'echo time(); phpinfo();', 30); ?>

eaccelerator_cache_result($key, $eval_code, $ttl=0)
caches the result of $eval_code in shared memory for $ttl seconds.
Result can be removed from cache by calling mmcach_rm() with the same $key.
For Example:
<?php eaccelerator_cache_output('test', 'time()." Hello";', 30); ?>

eaccelerator_cache_page($key, $ttl=0)
caches the full page for $ttl seconds.
For Example:
<?php
eaccelerator_cache_page($_SERVER['PHP_SELF'].'?GET='.serialize($_GET),30);
echo time();
phpinfo();
?>

eaccelerator_rm_page($key)
removes the page which was cached by eaccelerator_cache_page() with the same
$key from cache

eaccelerator_encode($filename)
returns the encoded bytecode of compiled file $filename

eaccelerator_load($code)
loads script which was encoded by eaccelerator_encode()

eaccelerator_put($key, $value, $ttl=0)
puts the $value into shard memory for $ttl seconds.

eaccelerator_get($key)
returns the value from shared memory which was stored by eaccelerator_put()
or null if it is not exists or was expired.

eaccelerator_rm($key)
removres the $key from shared memory

eaccelerator_gc()
removes all expired keys from shared memory

eaccelerator_lock($lock)
creates a lock with specified name. The lock can be released by function
eaccelerator_unlock() or automatic on the end of request.
For Example:
<?php
eaccelerator_lock("count");
eaccelerator_put("count",eaccelerator_get("count")+1));
?>

eaccelerator_unlock($lock)
release lock with specified name

eaccelerator_set_session_handlers()
install the eaccelerator session handlers.
Since PHP 4.2.0 you can install eaccelerator session handlers
in "php.ini" by "session.save_handler=eaccelerator".

eaccelerator_cache_output($key, $eval_code, $ttl=0)
caches the output of $eval_code in shared memory for $ttl seconds.
Output can be removed from cache by calling mmcach_rm() with the same $key.
For Example:

eaccelerator_cache_result($key, $eval_code, $ttl=0)
caches the result of $eval_code in shared memory for $ttl seconds.
Result can be removed from cache by calling mmcach_rm() with the same $key.
For Example:

eaccelerator_cache_page($key, $ttl=0)
caches the full page for $ttl seconds.
For Example:
<?php
eaccelerator_cache_page($_SERVER['PHP_SELF'].'?GET='.serialize($_GET),30);
echo time();
phpinfo();
?>

eaccelerator_rm_page($key)
removes the page which was cached by eaccelerator_cache_page() with the same
$key from cache

eaccelerator_encode($filename)
returns the encoded bytecode of compiled file $filename

eaccelerator_load($code)
loads script which was encoded by eaccelerator_encode()


Codificar el código para su distribución

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:

Código: php
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







Agradecimiento a Patxi Echarte por la guia basica