A partir de PHP 8 se incluyen dos nuevos modos de compilación Just-In-Time: Tracing JIT y Function JIT. Siendo el primero (Tracing JIT) la opción más prometedora hasta el momento, mostrando un rendimiento hasta 3 veces superior en pruebas benchmark sintéticas, y un rendimiento entre 1,5 y 2 veces superior en aplicaciones de ejecución prolongada, como WordPress.
Ventajas
Una de las ventajas más importantes de implementar compilación JIT en lenguajes de programación interpretados, tales como PHP, es que hace posible compilar y guardar fragmentos del código directamente como instrucciones del procesador, o código de máquina, dependiendo de su frecuencia de uso. Este acercamiento híbrido trae mejoras importantes en el rendimiento, ya que tener parte del código pre-compilado nos permite eliminar el tiempo adicional que de otra forma consumiría el compilador al re-procesar el código en cada nueva petición.
Activación
En PHP, JIT forma parte de la extensión OPcache, y por lo tanto, depende de esta para funcionar.
PHP 8+ incluye JIT por defecto, aunque desactivado. Afortunadamente, activarlo es muy sencillo y solo requiere realizar algunos cambios en nuestro archivo de configuración php.ini
:
; Activando OPcache opcache.enable=1 ; Activa la extensión OPcache para PHP base opcache.enable_cli=1 ;Activa la extensión OPcache para PHP CLI ; Activando el motor JIT opcache.jit_buffer_size=256M ; Activa el compilador JIT y establece el tamaño del buffer
Aplicando configuración adicional
Aunque PHP ya cuenta con una configuración por defecto que debería cubrir muchos casos de uso, también podemos controlar mejor el comportamiento del motor JIT de manera más granular añadiendo la opción opcache.jit
en nuestro archivo php.ini
. Esta opción acepta los valores disable
, off
, on
, tracing
, function
, y un valor de 4 dígitos (en orden CRTO) en el que cada dígito corresponde a un flag en específico, que iremos desglosando a continuación:
Configuración básica
disable
desactiva por completo el motor JIT, sin posibilidad de habilitarlo en tiempo de ejecuciónoff
desactiva el motor JIT, pero permite activarlo durante tiempo de ejecuciónon
activa el modotracing
tracing
un alias de los flags 1254function
un alias de los flags 1205
; Ejemplo de configuración básica opcache.jit = on
Configuración avanzada
Flags de cuatro dígitos con orden CRTO
CRTO: CPU optimization, Registrer allocation, Trigger, Optimization
C (Optimización por CPU)
0
Desactiva la optimización por CPU1
Activa optimización AVX si esta es soportada por el CPU
R (Asignación de registros)
0
Desactiva la asignación de registro1
Realiza asignación de registro por bloque2
Realiza asignación de registro globalmente
T (Desencadenador)
0
Compila todas las funciones al cargar el script1
Compila todas las funciones a la primera ejecución2
Perfila la primera petición y compila las funciones más usadas después3
Perfila en tiempo real y compila las funciones más usadas4
Utiliza JIT en modo Tracing, perfila en tiempo real y compila trazas de los segmentos de código más usados
O (Optimización)
0
Sin JIT1
JIT mínimo (invoca handlers estandar del motor VM)2
Handlers inline del motor VM3
Usa inferencia de tipos4
Usa gráfico de llamadas5
Optimiza el script en su totalidad
; Ejemplo de configuración específica (CRTO) opache.jit = 1254
Soporte
PHP 8 incluye soporte de compilación JIT en Linux y Windows con las las siguientes arquitecturas:
- x86
- x64
- ARM64, AArch64 (JIT backend, PHP 8.1+)
Retrocompatibilidad
Este cambio no crea problemas de retrocompatibilidad, PHP está diseñado para ignorar cualquier configuración no soportada en php.ini
, por lo que versiones anteriores de PHP solo ignorarán cualquier directiva JIT que encuentren y deberían ejecturarse con normalidad.
Regístrate hoy en Styde y obtén acceso a todo nuestro contenido.
Lección anterior Unión de Datos en PHP 8 Lección siguiente Atributos en PHP 8