PHP 8.0: mas rápido que nunca con el compilador JIT

Con el lanzamiento de la versión 8, PHP también vendrá con soporte de compilación Just-in-Time. Aumentaremos la velocidad de ejecución lanzando aplicaciones ya compiladas.

by Luigi Nori Date: 15-04-2020 php php8 php7 jit assembly 3d

Probablemente ya habéis oido la noticia hace unos meses de que el compilador JIT será agregado a PHP 8. Ya desde PHP 7.0, se han hecho cambios para mejorar el rendimiento, pero esto será un nuevo avance para PHP. Esta gran característica fue desarrollada hace 2 años, pero el lanzamiento de PHP 8.0 se espera en menos de 1 año. En este artículo, echaremos un vistazo a lo que realmente se trata, pero lo más importante es que intentaremos probarlo en Linux.

Que es JIT

Tal vez no conozcas al JIT, así que te explicaremos de qué se trata primero. Probablemente ya sabes que PHP es un lenguaje de scripts del lado del servidor, lo que significa que no necesitas compilar el código antes de que se ejecute (a diferencia de otros lenguajes como C/C++). En cambio, el módulo PHP lee el código y lo ejecuta. En otras palabras, no codificas el código para compilarlo en lenguaje de máquina para ejecutarlo, sino que codificas un script y luego lo envías a PHP para ser ejecutado en el lado del servidor con precisión.

PHP está equipado con una máquina virtual llamada Zend VM. ¿Por qué llamarla máquina virtual? Porque se comporta como un ordenador cuando ejecuta el código por sí mismo. Es responsable de leer y ejecutar el código PHP. Pero antes de eso, el código será leído y traducido de PHP a opcode, el lenguaje que Zend VM entiende. Entonces Zend VM será capaz de ejecutar ese código de operación. Esta es una ilustración para facilitar la comprensión.

Así que necesitamos un paso de "code parsing" primero y luego la interpretación. Lo aceleraremos, usando el llamado OPCache (Opcode Cache) que almacena los resultados de la fase de compilación, así que no será necesario volver a compilar la próxima vez. Así es como funcionaba PHP hasta ahora.

Así que ahora hablemos del compilador JIT, significa que compilaremos el código fuente en un lenguaje de máquina para ejecutarlo. JIT significa "Just-In-Time", lo que significa que llevará tiempo compilar, en lugar de primero compilar y luego ejecutar. Cuando necesites iniciar el guión, será compilado en el momento.

Para PHP, el compilador JIT compilará el código fuente en código de máquina y ejecutará ese código en lugar de enviarlo a Zend VM para ser ejecutado. Así que ya no necesitamos un intérprete y, por supuesto, el código funciona aún más rápido.

¿Será realmente más rápido?

Este es un demo que muestra la velocidad de PHP con el compilador JIT comparado con la versión antigua. En el vídeo se utiliza un código para crear imágenes 3D.

Pero, CUIDADO, nadie ha usado nunca antes el PHP para crear imágenes 3D!!!

Dado que nuestro escript será compilado en el código de la máquina y será ejecutado directamente por la CPU en lugar del intérprete server side, los aumentos de velocidad serán principalmente sobre el inicio del código en sí y el uso de la CPU (por lo que requiere la potencia de la máquina). Pero la aplicación Web no tiene tal código, todo será delegado por el proceso de I/O (query de base de datos, carga de files, solicitud HTTP, etc.), la mayoría de las veces la aplicación no hace nada, sólo escucha para mostrar los resultados de la base de datos o la API, etc. Desafortunadamente, ahora mismo es poco probable que una aplicación web sea más rápida.

¿Para qué es el JIT?

Desde la versión 7.0 de PHP, el problema de rendimiento ha sido uno de los grandes problemas a resolver, en parte debido a la competencia de HHVM de Facebook (que también utiliza el compilador JIT). OPCache, estructura los datos, optimizando todo poco a poco para obtener el máximo rendimiento.

Además, el rendimiento de PHP como lenguaje de servidor ya puede considerarse bastante bueno, y no será tan lento como en el pasado. Así que es hora de expandir las capacidades de PHP a áreas como análisis de datos, renderizado 3D/2D, etc.

En el pasado, el código de alto rendimiento se escribía a menudo como una extensión en C/C++ en lugar de un paquete PHP. Por ejemplo, phpredis es siempre 6-7 veces más rápido que predis. Si el código PHP es compilado en vez de interpretado, obtendrá paquetes con el mismo rendimiento que las extensiones escritas en C/C++.

Esta es la principal razón por la que se eligió el compilador de JIT: esta es la mejor y potencial dirección a seguir.

Testeamos en el servidor

Después de esta acertada introducción, probémoslo en el campo. Como todavía no hay una versión de PHP 8.0, tendremos que compilar a partir del código fuente de PHP versión 7.4, es decir, todavía en alfa, el master ya es 8.0. Primero, descarguemos el código fuente:

wget -O php.zip https://github.com/php/php-src/archive/master.zip unzip php.zip cd php-src-master

Así que instalamos adicciones. Usaremos Ubuntu Server, si usas otras distribuciones encontrarás el mismo paquete por ti mismo.

apt-get install autoconf bison dpkg-dev file g++ gcc libc-dev make pkg-config re2c libxml2-dev libsqlite3-dev

Generamos el file de build ./buildconf;

Entonces ejecutas ./configure para configurar la construcción. Selecciona las opciones para compilar PHP. Puedes elegir una ruta de instalación añadiendo -prefix = <dir_install> . Por defecto instalará /usr/local/bin , así que si ya tienes otra versión instalada, recuerda configurarlo. PHP se instalará en la ruta <dir_install>/bin/php . Añade la ruta al archivo de configuración con -with-config-file-path y -with-config-file-scan-dir si lo deseas.

./configure --help 

Por ejemplo ejecutamos ./configure come sigue:

./configure --prefix=/opt --with-config-file-path=/opt/php –with-config-file-scan-dir=/opt/php/conf.d

Montamos

make -j$(nproc)
make install

Así que comprobamos ejecutando :

php -v

desde shell debería sacar:

PHP 8.0.0-dev (cli) (built: Jul 15 2019 02:22:59) ( NTS ) 
Copyright (c) The PHP Group Zend Engine v4.0.0-dev, 
opyright (c) Zend Technologies     
with Zend OPcache v8.0.0-dev, Copyright (c), by Zend Technologies

El compilador JIT es parte de la extensión OPCache, así que habilitémoslo antes de usarlo. Añadamos estas líneas a fichero php.ini:

opcache.jit_buffer_size=32M
opcache.jit=1235

Ahora intentaremos ejecutar un archivo PHP con la opción

-dopcache.jit_debug = 1

Veremos el código assembly compilado. Por ejemplo, con un archivo como este:

<?php
$a = 0;
for ($i = 0; $i < 10000; $i++) {
$a += $i;
}
echo $a;

Será compilado en el código assembly de la siguiente manera:

JIT$/php-src-master/hello.php: ; (/php-src-master/hello.php)
sub $0x10, %rsp
lea 0x50(%r14), %rdi
cmp $0xa, 0x8(%rdi)
jnz .L1
mov (%rdi), %rdi
cmp $0x0, 0x18(%rdi)
jnz .L12
add $0x8, %rdi
.L1:
test $0x1, 0x9(%rdi)
jnz .L13
.L2:
mov $0x0, (%rdi)
mov $0x4, 0x8(%rdi)
; ...

Ahora probemos el punto de referencia para ver si realmente es más rápido. En el código fuente, hay un archivo Zend/bench.php que podemos probar. En este archivo hay muchos códigos calculados (hash, loop .etc). Este es el resultado (reformateado para facilitar la comparación):

Seguramente es más rápido, no es nada raro. Intentaremos comparar otra aplicación web, un proyecto Laravel y compararlo con la herramienta ApacheBench

ab -t10 -c10 http://test.localhost/

Este es el resultado:

PHP 7.3: 131.37 req/s
PHP 8.0 + JIT: 133.57 req/s

En resumen, a partir de la versión 8 será significativamente más rápido, pero por el momento, la mayor parte del código PHP existente en el mundo mantendrá los estándares que todavía son aproximadamente lentos. Sin embargo, se abrirán nuevos desarrollos para la nueva versión de PHP compilada por JIT.

Si necesita aclaración sobre cómo configurar correctamente un servidor web con php puede seguir nuestras guías

 
by Luigi Nori Date: 15-04-2020 php php8 php7 jit assembly 3d visitas : 7506  
 
Luigi Nori

Luigi Nori

He has been working on the Internet since 1994 (practically a mummy), specializing in Web technologies makes his customers happy by juggling large scale and high availability applications, php and js frameworks, web design, data exchange, security, e-commerce, database and server administration, ethical hacking. He happily lives with @salvietta150x40, in his (little) free time he tries to tame a little wild dwarf with a passion for stars.

 
 
 

Artículos relacionados

Guía Básica: Cómo Integrar una Base de Datos ArangoDB con PHP

ArangoDB es una base de datos multi-modelo que ofrece una combinación poderosa de características de base de datos documental, de grafos y de clave-valor. Su flexibilidad y rendimiento la convierten…

Seguimiento en tiempo real de los vuelos: la API de Flight Tracker

La API de Flight Tracker brinda a los desarrolladores la capacidad de acceder al estado de los vuelos en tiempo real, lo cual resulta extremadamente útil para integrar un seguimiento…

Ejecución de funciones PHP en AWS Lambda y API Gateway

¿Qué es AWS Lambda? AWS Lambda es un servicio de procesamiento sin servidor que puede ejecutar código en respuesta a eventos o condiciones predeterminados y administrar automáticamente todos los recursos de…

Cómo enviar un correo electrónico desde un formulario de contacto HTML

En el artículo de hoy vamos a escribir sobre cómo hacer un formulario que funcione y que al pulsar ese botón de envío sea funcional y envíe el correo electrónico…

6 Formas de leer archivos en PHP, con strings, array y más

Bienvenido a un tutorial sobre cómo leer archivos en PHP. Sí, así es, ¿qué tan difícil puede ser leer archivos en PHP? Se sorprenderá... No es tan sencillo como algunos…

Instalar Laravel Homestead en Windows 10

Instalar Homestead Mediante Vagrant Laravel Homestead es una máquina virtual que viene ya preparada para el desarrollo de proyectos con Laravel y otras tecnologías de PHP . Al ser una máquina…

Cookies HTTP: cómo funcionan y cómo usarlas

Hoy vamos a escribir sobre la forma de almacenar datos en un navegador, por qué los sitios web utilizan cookies y cómo funcionan en detalle. Continúa leyendo para averiguar cómo implementarlas…

Guía sencilla para convertir imágenes a WebP en PHP

El 30 de septiembre de 2010, Google anunció la publicación de un nuevo estándar abierto para la compresión con pérdida de gráficos de 24 bits en la web. La base…

Renderización lado servidor de Vue.js on Php

¿Intentas que el renderizado del lado del servidor funcione con PHP para renderizar tu aplicación Vue.js pero se atasca? Hay un montón de grandes recursos por ahí, pero hasta ahra no…

Cómo instalar Caddy Web Server con PHP-FPM en Ubuntu 16.04

El Caddy o Caddy web server es un servidor web de código abierto habilitado para HTTP/2 escrito en Go. Caddy puede funcionar en varios sistemas, incluyendo los que funcionan con…

PHP: como soluciónar el error «The e modifier is no longer supported»

Desde la versión 7 ya tenemos error al usar el modificador e con el preg_replace(). de hecho el modificador e, correspondiente a la constante PCRE PREG_REPLACE_EVAL, era antes utilizado en…

Cómo obtener el token de acceso a Instagram usando PHP

Cómo obtener el token de acceso a Instagram usando PHP? Para obtener el token de acceso Instagram, primero debes autenticar tu aplicación y luego obtener el token de acceso. Sigue los siguientes…