Sep 132015
 
Artículo Administración de Servidores

A diferencia de otros lenguajes de programación, como C++ o Java, PHP es un lenguaje interpretado. Esto significa que cada vez que se ejecuta un script escrito en PHP, el intérprete debe convertir las sentencias contenidas en el código fuente del script en sentencias de bajo nivel directamente ejecutables por la máquina.

En el caso de un servidor web, los scripts que generan el código HTML de las páginas que son entregadas a los clientes pueden ser ejecutados cientos o miles de veces cada día. Para evitar que el intérprete tenga que ejecutarse cada vez, es habitual implementar un mecanismo por el cual el opcode generado la primera vez que se invoca al script se guarda, y es reutilizado en sucesivas ejecuciones del mismo script.

Hasta la versión 5.4 de PHP, este mecanismo de cache estaba implementado por distintas extensiones, de entre las cuales la más popular es probablemente APC (Alternate oPcode Cache). La versión 5.5 de PHP incluye en la distribución base el “Zen opcode cache”, que sustituye a la extensión APC.

En este artículo se exponen las características de esta nueva implementación, y la manera de configurarla.

Instalación de Zend opcode cache en PHP < 5.5

Zend opcode cache puede ser utilizado también en versiones de PHP anteriores a PHP 5.5. A continuación se indica cómo realizar la instalación en un servidor Linux:

Para realizar la instalación, comenzamos por instalar el repositorio PECL (PHP Extension Community Library)

$ sudo apt-get install -y php-pear

también deberemos instalar sus dependencias:

$ sudo apt-get install -y build-essential php5-dev

Una vez instalado pecl, realizamos la instalación de zend opcode cache (se puede comprobar cuál es la versión mas reciente en el changelog de PECL::ZendOpCache):

$ sudo pecl install zendopcache-7.0.5
downloading zendopcache-7.0.5.tgz ...
  ...
Build process completed successfully
Installing '/usr/lib/php5/20100525/opcache.so'
install ok: channel://pecl.php.net/zendopcache-7.0.5
configuration option "php_ini" is not set to php.ini location
You should add "zend_extension=/usr/lib/php5/20100525/opcache.so" to php.ini
$

Después, con un editor de texto creamos el fichero de configuración “/etc/php5/mods-available/opcache.ini” con el siguiente contenido:

zend_extension=/usr/lib/php5/20100525/opcache.so
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.revalidate_freq=60
opcache.fast_shutdown=1
opcache.enable_cli=1

Nota: El valor de “zend_extension” es la ubicación de la librería “opcache.so” que se indica en la última línea de la salida del comando “sudo pecl install zendopcache-7.0.5” y puede ser diferente a la que aparece en el ejemplo. En caso de duda, se puede buscar la ubicación de dicho fichero desde la raíz del sistema de ficheros, con el comando:

$ sudo find / -name 'opcache.so' -print

Por último, creamos un enlace simbólico al fichero de configuración bajo el directorio /etc/php5/conf.d, y reiniciamos el servidor web:

$ sudo ln -s /etc/php5/mods-available/opcache.ini /etc/php5/conf.d/20-opcache.ini
$ sudo /etc/init.d/apache2 restart

Monitorización de la cache

Hay varias herramientas que permiten examinar el estado de la cache y actuar sobre la misma. Entre ellas se encuentra opcache-gui by amnuts. Para instalarla en un subdirectorio “opcache” bajo el DocumentRoot del servidor (que en el ejemplo es /var/www/example.com/htdocs), ejecutamos los comandos:

$ cd /var/www/example.com/htdocs/
$ mkdir opcache
$ cd opcache
$ wget https://raw.github.com/amnuts/opcache-gui/master/index.php -O opcache.php

Nota: Es conveniente establecer algún tipo de restricción de acceso al directorio en donde instalemos esta herramienta. Un procedimiento sencillo para protegerlo se puede consultar en nuestro artículo: “Cómo proteger una página web con contraseña en Apache

Con esto, podemos apuntar el navegador a la url: http://www.example.com/opcache/opcache.php (sustituyendo www.exmple.com por el nombre de nuestro dominio), y accedemos a la pantalla “Overview” del monitor de la cache:

zend-opcache

La pantalla presenta una información general del sistema, así como el valor de los distintos parámetros de configuración, y una representación gráfica del uso de la memoria asignada y el porcentaje de peticiones servidas desde la cache (hit rate).

Parámetros de configuración

El módulo zend opcache tiene numerosos parámetros de configuración, que se pueden establecer en el fichero “/etc/php5/mods-available/opcache.ini”. Entre ellos, se encuentran:

  • enable – Habilita la funcionalidad del plugin
  • enable_cli – Habilita la funcionalidad del plugin, cuando se ejecuta un script desde la línea de comandos
  • memory_consumption – Es la cantidad de memoria, en MBytes, que se reserva para almacenar el código PHP precompilado
  • max_accelerated_files – Es el número máximo de scripts (ficheros con extensión “*.php”) precompilados a guardar en cache
  • revalidate_freq – Es el tiempo en segundos durante el cual se considera válido un contenido en cache, antes de volver a comparar el tiempo en el que se guardó con la fecha de última modificación del script correspondiente.
  • blacklist_filename – Ubicación de un fichero que contiene los nombres de scripts que no deben ser guardados en cache, uno por línea. Se pueden utilizar comodines (p.ej., “/var/www/*-nocache.php”)
  • consistency_checks – Número de solicitudes de un script al cabo de las cuales se comprueba el checksum del contenido guardado en cache (sólo interesa establecer un valor de este parámetro en el entorno de desarrollo y pruebas, pero no en producción)
  • max_file_size – Tamaño máximo de un script compilado que se puede guardar en cache (en bytes)
  • enable_file_override – Si esta opción está habilitada, se comprobará si el fichero script solicitado se encuentra en cache cuando la aplicación realice llamadas a las funciones file_exists(), is_file() y is_readable()

Otros parámetros de configuración que pueden ser convenientes en determinados casos son:

  • dups_fix
  • interned_strings_buffer
  • fast_shutdown
  • error_log
  • force_restart_timeout
  • inherited_hack
  • load_comments
  • log_verbosity_level

Referencias

 Publicado por en 3:33 pm

 Deja un comentario

(requerido)

(requerido)