¡No, PHP no está muerto!
El pasado junio, PHP celebró su vigésimo aniversario, pero a pesar de su mayoría de edad y su uso muy extendido, PHP tiene una mala reputación. A menudo se le critica por no ser lo suficientemente estricto, demasiado lento y respaldado por una comunidad que carece de profesionalismo. Como resultado, PHP a menudo es rechazado en proyectos web a gran escala. Sí, las objeciones contra PHP a menudo están bien fundamentadas, pero los cambios que se introdujeron en el lenguaje desde 2009, cuando se lanzó la versión 5.3, son suficientes para convencernos de que tengamos un replanteamiento. Esto se debe a que el lenguaje, que ha hecho una contribución significativa al crecimiento de sitios web dinámicos y cuya versión 7 se lanzará a mediados de noviembre, está más vivo que nunca.
¿PHP no es lo suficientemente estricto?
Hay dos tipos de lenguaje de programación: lenguajes mecanografiados y aquellos que no lo son, conocidos como lenguajes dinámicos. Los lenguajes mecanografiados obligan a los desarrolladores a definir explícitamente el formato que desean asignar a cada variable (en la memoria), mientras que los lenguajes dinámicos encuentran el mejor formato por sí mismos. Esto es más fácil para el desarrollador, pero a veces el uso de la memoria no está optimizado. Por ejemplo, si tuviera que administrar una gran cantidad de datos, normalmente elegiría un formato que consumiera poca memoria por pieza de datos; sin embargo, los lenguajes de alto nivel como PHP no siempre eligen bien. Alguien que no sepa cómo funciona PHP podría desarrollar fácilmente un programa que monopolice todos los recursos del servidor y decida erróneamente que PHP no es lo suficientemente estricto.
La escritura dinámica realmente impone ciertas restricciones al escribir código. Por lo tanto, es posible, en teoría, mezclar dos formatos de datos diferentes, ¡pero es posible que no obtenga necesariamente los resultados que espera! Agregue una palabra del diccionario a un número, por ejemplo. Nunca harías eso, ¿verdad? Sin embargo, esta es una de las causas del error PHP más común. Sin embargo, la tipificación dinámica tiene un gran atractivo. En la web, la mayoría de los datos se intercambian en formato de texto (a través del protocolo HTTP), pero en algunos casos esperará valores numéricos en lugar de datos textuales; ¡Después de todo, hemos podido compartir imágenes y videos en la web durante 20 años! La codificación dinámica permite al desarrollador simplificar su código y cambiar entre texto y valores numéricos muy fácilmente. El inconveniente de esto es un mayor riesgo de errores y problemas al mantener las aplicaciones desarrolladas.
Afortunadamente, la comunidad PHP y los desarrolladores web en general han mejorado mucho en los últimos diez años. Se han analizado y documentado malas prácticas y, lo más importante, se han desarrollado una serie de herramientas para erradicarlas. Uno de los mejores ejemplos es OWASP, que crea una lista de los problemas de seguridad de Internet más comunes cada año. Con esto en mente, ¿podemos decir que PHP no es lo suficientemente estricto? Cualquier trampa se puede esquivar fácilmente con un buen conocimiento del tipeo dinámico y, lo que es más importante, ¡nada obliga a los desarrolladores a ser tan flexibles como el lenguaje que usan!
Popularizado por novatos, injustamente rechazado por profesionales
La popularidad de PHP se puede explicar fácilmente. Su flexibilidad lo hace amigable para los novatos, y como resultado, muchos de nosotros aprendimos a desarrollar usando PHP. Pero en la tecnología, como en el amor, los primeros días pueden ser difíciles, y hay algunas cosas de las que podemos sentirnos avergonzados en el futuro. Muchas aplicaciones PHP codificadas por desarrolladores inexpertos se han convertido en un paraíso para las malas prácticas que a veces pueden comprometer la seguridad y el rendimiento: problemas de seguridad de datos del cliente *, procesamiento masivo de datos sin optimización, etc. Debido a esto, PHP se convirtió rápidamente en un chivo expiatorio.
Al comienzo del milenio, cuando Internet se estaba volviendo popular, se formaron diferentes comunidades PHP. Fue en este momento que se crearon bibliotecas de programación para que los desarrolladores compartan y reutilicen fragmentos de código. Esto ayudó a mejorar la calidad de los proyectos desarrollados en Java, por ejemplo. Sin embargo, la comunidad PHP tardó un poco en unirse, lo que significaba que cada equipo de desarrolladores tenía que desarrollar su propia biblioteca. En consecuencia, PHP fue visto por los profesionales como un lenguaje para principiantes que no era adecuado para proyectos serios.
Sin embargo, PHP se ha utilizado para proyectos web a gran escala, como Wikipedia y Facebook, que cuentan con millones de conexiones al día y cuyos equipos definitivamente no están formados por principiantes. ¿Cómo puede ser esto así? Bueno, en 2009 la comunidad PHP se despertó y el lenguaje cambió mucho. La versión 5.3, bajo la apariencia de una versión menor, estaba detrás de una serie de cambios importantes, comenzando con el mecanismo crucial de espacios de nombres. Los espacios de nombres simplifican la separación de código en diferentes bibliotecas, lo que reduce significativamente el “efecto de borde”. Esto permitió a los desarrolladores escribir bibliotecas de código, lo que alentó la comunidad PHP al crear la plataforma Composer diseñada para compartir y distribuir bibliotecas. La cantidad de bibliotecas de códigos disponibles en Composer se ha disparado y ha permitido a los desarrolladores concentrarse en los aspectos más técnicos de su trabajo.
La biblioteca Guzzle es un ejemplo perfecto: antes de que Composer existiera, Curl se usaba a menudo para realizar consultas HTTP. Aunque fue fácil realizar consultas HTTP con este lenguaje, una serie de restricciones técnicas no se tuvieron en cuenta necesariamente (la definición de tiempo de espera, el límite de datos, el uso de transmisión, etc.) En consecuencia, la descarga de archivos grandes a menudo llevaría a quedando sin memoria. Cuando llegó Guzzle, tenía los componentes necesarios para optimizar Curl y realizar consultas HTTP más fácilmente. Como consecuencia, las buenas prácticas se han extendido y ha habido una reducción global en la cantidad de memoria utilizada por los scripts PHP para realizar solicitudes HTTP.
Al mismo tiempo que el lanzamiento de PHP5.3, la llegada de grandes marcos de desarrollo como Symfony2, Zend Framework2 y más recientemente Laravel, permitió la industrialización del desarrollo de PHP. Estos nuevos marcos generaron técnicas de desarrollo más rápidas y han contribuido a la difusión de buenas prácticas al simplificar la configuración de la memoria caché, aumentar los niveles de seguridad y acelerar la ejecución del código. En pocas palabras, las herramientas que hacen posible el uso de PHP como “lenguaje profesional” han estado vigentes durante cinco años. Finalmente, PHP 5.3 también señaló un aumento en la tasa de lanzamiento de nuevas versiones del lenguaje, que ahora es casi anual. PHP 5.6 ya está disponible y la comunidad solo admite las versiones 5.5 y 5.6.
PHP: ¿un lenguaje lento? Se trata de interpretación …
Un poco antes, usé Facebook como ejemplo de un proyecto que usa PHP a gran escala.
Tengo que ser sincero, Facebook no usa PHP como tú y yo sí. La compañía ha intentado acelerar el código PHP. En 2013, después de intentar compilar PHP en 2010 con la aplicación Hip-Hop, los desarrolladores de Mark Zuckerberg crearon HHVM, una nueva plataforma para ejecutar programas PHP, y terminaron con un lenguaje más restrictivo que PHP, conocido como Hack. ¿Debemos por lo tanto concluir que PHP sufre problemas de lentitud crónica?
PHP es un lenguaje interpretado y, por lo tanto, es inevitablemente más lento que los lenguajes compilados: lenguajes transformados en variables ejecutables autónomas (en el lenguaje nativo de la máquina), como C o C ++. Los lenguajes interpretados se “compilan” en cada ejecución, lo que aumenta el tiempo de computación. Algunos lenguajes interpretados, como Java o Python, a veces están “precompilados” en un lenguaje que está más cerca del lenguaje de la máquina (código de bytes), pero su ejecución aún necesita una segunda interpretación muy rápida. Por último, algunos lenguajes, incluidos PyPI, Java8 y Lua, ahora son capaces de compilarse directamente en el idioma nativo de la máquina durante su ejecución, lo que permite que la aplicación se inicie muy rápidamente. Este proceso se llama JIT (compilación Just-In-Time).
Volviendo al tema de la aparente lentitud de PHP, PHP ciertamente no es el único lenguaje interpretado en la web, ¡ni mucho menos! Sin embargo, PHP tiene una característica especial: no es un lenguaje persistente. Cuando alguien se conecta a un sitio web PHP, el servidor PHP se reinicia y luego se vuelve a compilar. Por el contrario, lenguajes como Java solo se compilan cuando se inicia la aplicación, que a menudo es cuando se inicia el servidor. Esta elección de diseño es una ventaja en términos de escalabilidad para aplicaciones codificadas en PHP porque cada solicitud se beneficia de un entorno nuevo y saludable en el que se puede ejecutar. Por ejemplo, una pérdida de memoria que ocurre cuando una aplicación PHP está en uso no afectará las consultas realizadas por los usuarios posteriores. La seguridad también es más estricta porque cada consulta está aislada. Y, sobre todo, las aplicaciones son más estables, por lo que los administradores de sistemas no tienen que reiniciar regularmente el servidor PHP a diferencia de los administradores de Tomcat (el servidor Java), que monopoliza toda la RAM por encima de un cierto período de actividad. (¡Por supuesto, esto solo sucede con aplicaciones mal codificadas!).
Sí, es cierto que PHP alguna vez pudo haber sido más lento que otros idiomas, ya que no es un lenguaje persistente, pero este no ha sido el caso desde 2012. PHP 5.4 se lanzó en 2012 y viene con un caché incorporado motor, OpCache **, que puede almacenar la compilación desde la primera solicitud. Algunas personas dirán que, estrictamente hablando, esto no es nada nuevo porque los módulos como eAccelerator, APC o Xcache siempre se han usado mucho para lidiar con la “lentitud”. Sin embargo, el hecho de que este mecanismo de caché se haya integrado en PHP nos muestra que la velocidad de ejecución de PHP es muy similar a la de otros lenguajes, con la ventaja adicional de la escalabilidad. Con esto en mente, le recomendamos que actualice a una versión más reciente de PHP y active el motor PHP-FPM para beneficiarse de estas mejoras de rendimiento.
¿Por qué, entonces, se ha atascado la reputación de PHP por ser un lenguaje lento? PHP 5 podría ser un poco menos eficiente que los lenguajes JIT, pero una vez más, el nivel promedio de los desarrolladores de PHP probablemente sea el culpable, dado que hay muchos novatos entre ellos. De hecho, varios sitios PHP son lentos, no por el código PHP en sí, sino por la relación entre la aplicación y su entorno. La mayoría de los sitios PHP usan una base de datos alojada en otro servidor y no optimizan sus consultas SQL. Algunos de ellos guardan archivos en el disco duro del servidor. Hay tantas cosas que pueden conducir a un aumento de la latencia: la red, la escritura en disco, etc., sin mencionar fallas de optimización … ¡No estamos contando los sitios web que aparecen como recortadores porque realizan consultas en una base de datos sin un índice! Un ejemplo actual son los complementos de WordPress codificados en PHP. Muchos complementos realizan consultas en otros servidores y buscan en muchas bases de datos para cada consulta de usuario. Esto ralentiza los sitios web considerablemente, independientemente de PHP. Por cierto, si desea tratar de comprender por qué su aplicación no funciona, le recomiendo que vea esta conferencia, “Más allá de PHP: no se trata (solo) del código”, que se presentó durante el Fosdem 2015.