El pasado 8 de junio se cumplieron 20 años de la primera versión del lenguaje PHP y mucho han cambiado las cosas desde aquella sencilla API C para web de código abierto. Son muchas las funcionalidades implementadas desde entonces, adaptándose a los nuevos retos y exigencias de la web sin renunciar a sus raíces: ser un lenguaje flexible y sencillo de aprender, escribir, leer y depurar.
Ya es posible probar una versión temprana de lo que será la próxima «major release» de PHP, con la que la gente de Zend entra de lleno en la guerra del rendimiento.
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.
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 |
Resumiendo
No cabe duda de que las perspectivas de PHP7 son emocionantes. Sin problemas de retrocompatibilidad destacables, en unos meses disfrutaremos de consumos de memoria y CPU significativamente más reducidos. Al menos nosotros, vamos a esperar la nueva versión de PHP con los brazos abiertos 🙂
1 Comentario
¿Por qué no comentas tú también?
[…] de conocer un poco más las tripas de PHP y la optimización que nos llega de la mano de PHP7, tocó el turno de comer y nos desplazamos a la sala multiusos donde, aparte de estar los stands […]
Irontec en la PHP Barcelona Conference 15 | Blog Irontec Hace 9 años
La verdad es que se ve muy prometedor, lo que no me queda claro es si va a ser un gran esfuerzo hacer que nuestras aplicaciones PHP 5.4 ó 5.5 funcionen bien en PHP 7.
Muchas gracias por los benchmark.
vladzur Hace 9 años
La verdad me ha gustado bastante, sobre todo el operador de fusión de null (??) (es uno de mis favoritos), espero poder portarme a php7 pronto, a penas me desocupe en mis exámenes.
Federico Cañellas Hace 9 años
[…] en las peculiaridades de HTTP/2 ni PHP7 (te recomiendo el artículo de Mikel Madariaga sobre las pruebas que hicimos de PHP7 en nuestro blog), quepa decir que ambas tecnologías tienen un frente común: la mejora del […]
Entorno LAMP con HTTP/2 y PHP7 | Blog Irontec Hace 9 años
[…] Probamos PHP7: La batalla por el rendimiento, de Mikel Madariaga. […]
Los 10 post más leídos del Mejor Blog de Software Libre | Blog Irontec Hace 9 años
[…] PHP6 fue un fracaso por su intento de implementar soporte Unicode. PHP 7 puso sus esfuerzos fundamentales en ganar rendimiento retocando el motor Zend Engine a partir de los trabajos de PHP Next Generation. La idea de la versión 7 es una sintaxis PHP que está más orientada a objetos y más robusta. PHP 7 se parece más a Java que a la versión anterior de la misma sintaxis. Análisis sobre las características de PHP7 hay muchos ya escritos: entre ellos destacamos este análisis y este artículo. […]
Tendencias en desarrollo de software para 2016 – Título del sitio Hace 7 años
Queremos tu opinión :)