
PHP7 Novedades
Ya es posible probar una versión 7 que es la “major release” de PHP, con la que la gente de Zend entra de lleno en la guerra del rendimiento.
Estas novedades y mejoras se afirma desde el equipo de core del proyecto que consiguen un rendimiento en PHP 7 que es el doble de rápido que PHP 5.6 y entre ellas destacar:
- Nueva versión de Zend Engine (de nombre en clave PHP#NG)
- Importante reducción del uso de memoria
- Árbol sintáctico abstracto
- Soporte consistente a los 64-bits
- Un buen número de errores fatales convertidos en excepciones (¡Aleluya!)
- Mejora en la jerarquía de estas excepciones
- Generador de números aleatorio más seguro
- Operador de coalescencia con null (el ansiado ??)
- Clases anónimas
- Compatibilidad con la recién salida última versión de OpenSSL (1.0.2e)
Además se han eliminado todas las extensiones y funcionalidades viejas y a las que ya no se daba soporte y se han arreglado decenas de bugs, como se puede comprobar en un changelog que es realmente impresionante en cuanto a volumen y longitud.
Renunciando a PHP6
La sexta versión de PHP tenía un propósito central muy concreto, hacer uso de UTF-16 en el encoding interno del motor, objetivo que resultó ser mucho más complejo de lo previsto. Ante problemas aparentemente insalvables, que incluían fallos de retrocompatibilidad, se acabó optando por mover funcionalidades desarrolladas para PHP6 a PHP 5. Hoy PHP 6 queda para el recuerdo como algo que no pudo ser.
Cuando el rendimiento es crítico
El nuevo siglo trajo importantes retos al mundo web, portales web liderados por compañías como Facebook o Google se enfrentaban a concurrencias impensables pocos años antes. Por si fuera poco, el tráfico no dejaba de incrementar mes tras mes sin pronósticos claros de dónde podría estabilizarse. El caso de Facebook nos resulta especialmente interesante, por tratarse se una empresa que había confiado en PHP como lenguaje principal de desarrollo. Lenguaje al que no querían renunciar, pero les obligaba a hacer algo en cuanto al rendimiento: el objetivo era dar respuestas más inmediatas que mejorarán la experiencia de usuario, reducir el número de servidores y consumo de memoria.
Si bien es cierto que los cuellos de botella de las aplicaciones web vienen, en un 99% de los casos, dados por la base de datos, Facebook logró optimizarla lo suficiente vía caches como para empezar a preocuparse por el propio lenguaje de programación.
La empresa empezó reescribiendo porciones de código del núcleo PHP y publicándolo en forma de parches pero no lograban que el rendimiento mejorara a un ritmo satisfactorio. Más adelante desarrollaron HipHop for PHP, un traductor de código PHP a c++ que posteriormente compilaban con g++. Poco después, lo reemplazaron por HHVM (HipHop Virtual Machine), un compilador just in time que mejoraba más aún los resultados. No es que inventaran nada nuevo, ya existían soluciones parecidas en otros lenguajes como python e incluso en el propio PHP, aunque probablemente no con estos niveles de compatibilidad.
Les llevó años, pero Facebook lo había logrado: rendimiento altamente competitivo, con mejoras de rendimiento cercanas al 100%, sin renunciar a PHP.
La respuesta de Dmitry Stogov
No es que PHP no haya mejorado en lo que a rendimiento se refiere estos últimos años, todo lo contrario, pero aún estaba lejos de otros lenguajes y soluciones.
Performance
La nueva “major release” nace de una rama experimental liderada por el programador ruso Dmitry Stogov, miembro principal de grupo de desarrollo de PHP, y viene para competir de tú a tú con HHVM en aplicaciones reales. Como es natural, la séptima versión también traerá nuevas funcionalidades pero estas quedan fuera del alcance del artículo.
Resultados oficiales
Tal y como se puede apreciar en las imágenes los resultados varían en función del portal o framework empleado pero podemos hablar de una mejora media de entorno al 30% respecto a HHVM y 46% respecto a PHP5.6. Igualmente el consumo de memoria ha mejorado notoriamente con la implementación de un nuevo gestor de memoria.
Nuestras pruebas: 5.6 vs 7
En Irontec nos gusta ver las cosas con nuestros propios ojos y nos hemos hecho con una máquina virtual con PHP7 “Rasmus Lerdorf approved”. Dado que las propias fuentes de PHP incluyen tests sintéticos de rendimiento, decidimos empezar por ahí:
Test | PHP 5.6 | PHP 7 |
bench.php | 3.55 seg. | 1.29 seg. |
micro_bench.php | 14.0 seg. | 5.89 seg. |
La mejora es radical, comprobemos si efectivamente esto se traslada a aplicaciones reales como WordPress:
WordPress | PHP 5.6 | PHP 7 |
---|---|---|
Server Software | nginx/1.8.0 | nginx/1.8.0 |
Concurrecia | 10 | 10 |
Tiempo tomado en el test | 39.99 seg. | 18.44 seg |
Peticiones completadas | 1000 | 1000 |
Peticiones por segundo | 25.00 | 54.23 |
Probablemente debido al uso de una versión más madura, nuestras pruebas arrojan resultados mejores a los oficiales.
Final round: Klear
No podíamos concluir el análisis sin poner a prueba nuestro framework para gestión de contenidos Klear. Cuando nos disponíamos a instalar el entorno vimos que la extensión en C para PHP que utilizamos habitualmente para parsear los ficheros .yaml aún no compila con PHP7. Klear hace un uso intensivo de este tipo de ficheros, lo que se lleva buena parte de los ciclos de cpu. Dado que aquí estábamos evaluando el rendimiento, no nos importo reemplazar dicha extensión por un parser PHP puro más lento que pusiera a prueba la nueva versión.
La siguiente tabla muestra el número de peticiones por segundo en pantallas rescatadas de proyectos reales con y sin accesos a base de datos.
PHP 5.6 | PHP 7 | |
---|---|---|
Página sin accesos a base de datos | 49.27 | 93.41 |
Página con accesos a base de datos | 0.93 | 1.21 |