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: