Acelerar PHP con OPcache

PHP de por sí, es lento, de eso no hay duda, así que toda posibilidad de optimizar su rendimiento debe ser bienvenida. OPcache es una de las formas más sencillas de acelerar la ejecución de PHP,  además viene integrada con PHP desde la versión 5.5.0. Para versiones anteriores (5.2, 5.3 y 5.4) se puede instalar con PECL.

¿Qué hace OPcache? Es un módulo de PHP que almacena los scripts de PHP precompilados en formato bytecode en la memoria compartida del sistema (shared memory), así pues, gracias a esto se elimina la necesidad de cargar e interpretar los scripts PHP en cada petición.

Instalación de OPcache

El otro día vimos como instalar PHP 7 en RHEL y CentOS. ¿Cómo podemos entonces habilitar OPcache en una instalación similar? Pues es extremadamente sencillo, únicamente tenemos que instalar el paquete opcache a través del repositorio correspondiente. Si recordáis ese post, estamos utilizando una versión muy actual de PHP (7.3) por lo que tendremos que utilizar el paquete precompilado de OPcache de esa versión. Si usaramos el repositorio de CentOS o RHEL, sería de una versión de PHP distinta (5).

Así pues, la instalación es tan sencilla como ejecutar lo siguiente:

# yum install php-opcache.x86_64

¿Por qué no especifico el repositorio remi? Porque ya lo puse durante la instalación de PHP como repo por defecto:

# yum-config-manager --enable remi-php73

Ante la duda, se puede ver claramente qué versión va a instalar durante el proceso de instalación:

[...]
Loading mirror speeds from cached hostfile
 * epel: mirror.netweaver.uk
 * remi-php73: remi.mirror.ate.info
 * remi-safe: remi.mirror.ate.info
Resolving Dependencies
--> Running transaction check
---> Package php-opcache.x86_64 0:7.3.4-1.el7.remi will be installed
--> Finished Dependency Resolution

Dependencies Resolved

=============================================================================================================================
 Package                      Arch                    Version                              Repository                   Size
=============================================================================================================================
Installing:
 php-opcache                  x86_64                  7.3.4-1.el7.remi                     remi-php73                  306 k

Transaction Summary
=============================================================================================================================
Install  1 Package
[...]

Se ve claro que va a instalar el correcto (7.3.4-1.el7.remi).

Configuración de OPcache

Una vez instalado, toca especificar los parámetros de opcache en el archivo de configuración global de php php.ini, normalmente en:

/etc/php.ini

Si tenéis dudas, ejecutad un phpinfo() para ver qué archivo carga en vuestra instalación. En la documentación oficial veréis que hay muchos parámetros, así que os dejo los más importantes:

$ tail -8 /etc/php.ini
; opcache
opcache.enable=1
opcache.validate_timestamps=1
opcache.revalidate_freq=60
opcache.max_accelerated_files=10000
opcache.memory_consumption=64
opcache.interned_strings_buffer=8
  • opcache.enable: el valor «1» especifica que opcache está activo. «0» significa desactivado.
  • opcache.validate_timestamps: opción interesante… activada (1) hará que de forma periódica se analice si el archivo php ha sido modificado para ver si es necesario actualizar la caché del mismo. Esto es útil en sitios en los que los archivos de php se modifican a menudo, ya que si estuviera desactivada, sería necesario reiniciar php (php-fpm en caso de Nginx, por ejemplo) cada vez que hicieramos un cambio.
  • opcache_revalidate_freq: intervalo de tiempo para hacer la comprobación de lo mencionado en la propiedad anterior.
  • opcache.memory_consumption: tamaño de la caché en MB.
  • opcache.max_accelerated_files: número máximo de scripts que se pueden cachear.
  • opcache.interned_strings_buffer: esto es algo así como «deduplicación» de variables de PHP. Revisa cadenas en los scripts y las almacena todas juntas en una única variable.

Con estos valores por defecto deberíais notar una mejora notable en el tiempo de respuesta de los scripts PHP. Podéis usar un estupendo script del usuario de github amnuts que presenta un frontal php con toda la información necesaria para monitorizar el rendimiento de la caché. Para muestra un botón, juzgad vosotros mismos los resultados. Con una utilización mínima de memoria RAM, las estadísticas de caché hits y objetos es abrumadora:

opcache monitoring