5 Maneras de Aumentar el Rendimiento de PHP-Tideways
5 Formas de aumentar el rendimiento de PHP
BONUS: Hemos discutido este tema con un experto en la comunidad PHP en nuestro podcast:
Fuera de la proverbial caja, PHP proporciona un rendimiento decente. Sin embargo, hay varias cosas que nosotros, como desarrolladores de PHP y administradores de sistemas, podemos hacer para aumentar aún más su rendimiento; a veces sin casi ningún esfuerzo.
En este post, voy a pasar por cinco de esas formas. Para cuando haya terminado de leer, debería ver al menos un aumento notable en el rendimiento de su aplicación PHP. Empecemos.
Use PHP 7
Una de las mejores formas de mejorar el rendimiento de PHP es ejecutar la última versión (PHP 7). Ofrece una mejora de velocidad significativa con respecto a cualquier versión anterior. Ahora, los resultados siempre variarán, ya que no hay dos aplicaciones iguales. Sin embargo, según los informes de una serie de desarrolladores diferentes y empresas de alojamiento notables, las mejoras de rendimiento son significativas.
Aquí hay una pequeña muestra:
- Los puntos de referencia oficiales de PHP informan que PHP 7 puede ejecutar el doble de solicitudes por segundo en comparación con PHP 5.6.
- Los parámetros de rendimiento de PHP de Kinsta muestran que WordPress 5.0 puede ejecutar 3 veces más transacciones que PHP 5.6; y
- Pantheon informó que PHP 7 dio una mejora del 64% sobre la versión 5.3.
Si eso no es suficiente para ti, revisa tus puntos de referencia y mira qué dicen.
Además, PHP 7.0.0 fue lanzado el 3 de diciembre de 2015, y la última versión estable, 7.3.6, fue lanzada el 30 de mayo de este año.
Además, la versión final de PHP 5, 5.6, fue EOL (Fin de vida) hace 7 meses, el 31 de diciembre de 2018. Por lo tanto, si aún no lo ha hecho, ya es hora de que haga la transición a PHP 7. Realice la actualización y, como dijo Rasmus en phpCE 2018, vaya verde(er) al reducir sus costos de alojamiento.
Desinstalar Xdebug
Lo siguiente que debe comprobar es que Xdebug no esté instalado en sus servidores de producción. Claro, Xdebug es uno de los perfiladores y depuradores más sofisticados y completos para PHP, pero nunca debe habilitarse (ni siquiera instalarse) en un servidor de producción, al menos hasta que se lance Xdebug 3 y debe unirse a nosotros para apoyar a Derick para trabajar en él.
Si bien los parámetros de rendimiento varían (siempre lo hacen), un informe sobre el desbordamiento de pila mostró un aumento del rendimiento del 50% al eliminar por completo Xdebug. Además, es importante tener en cuenta que a pesar de que Xdebug se instaló en el servidor, ¡ni siquiera estaba habilitado!
Xdebug performance benchmark
Para comprobar si está instalado, ejecute php -m | grep -i xdebug
o consulte el panel de administración de su proveedor de alojamiento. Y si desea saber más sobre cómo funciona Xdebug, consulte la documentación de Xdebug.
Use Composer Optimize Autoloader
Si bien es probable que todos estemos muy familiarizados con el uso de Composer para manejar la administración de paquetes por nosotros, si no consideramos optimizar la configuración que genera, nuestras aplicaciones no funcionarán lo mejor posible.
Aquí hay una cita de la documentación del compositor que explica por qué:
debido a la forma en que se configuran las reglas de carga automática PSR-4 y PSR-0, it Composer necesita verificar el sistema de archivos antes de resolver el nombre de una clase de manera concluyente. Esto ralentiza un poco las cosas, pero es conveniente en entornos de desarrollo porque cuando agrega una nueva clase, se puede descubrir/usar inmediatamente sin tener que reconstruir la configuración del cargador automático.
Para mejorar el rendimiento, Composer ofrece tres niveles de optimización::
- Generación de mapas de clase
- Mapas de clase autorizados
- Caché APCu
1: Generación de mapas de clases
Esta estrategia convierte las reglas PSR-4/PSR-0 en reglas de mapa de clases. Esta estrategia es más rápida porque el mapa de clases puede devolver instantáneamente la ruta completa a los archivos conocidos y evita una operación de estadísticas del sistema de archivos.
Para habilitar este nivel de optimización, ejecute el siguiente comando:
composer dump-autoload --optimize
2/A: Mapas de clases autoritativos
Además de habilitar automáticamente el Nivel 1, al usar este nivel, si no se encuentra una clase en el mapa de clases generado, el cargador automático no intentará buscar en el sistema de archivos de acuerdo con las reglas PSR-4. Para habilitar este nivel de optimización, ejecute el siguiente comando:
composer dump-autoload --classmap-authoritative
2/B: Caché APCu
Este nivel agrega una caché APCu como reserva para el mapa de clases. Sin embargo, no genera el mapa de clases. Dado eso, el nivel uno tendría que activarse manualmente. Para habilitar este nivel de optimización, ejecute el siguiente comando:
composer dump-autoload --apcu
Hay compensaciones
Si bien cada uno de estos niveles puede mejorar el rendimiento de la aplicación, cada uno de ellos tiene compensaciones que deben entenderse antes de ser utilizados. Asegúrese de consultar la documentación de Composer antes de usarlos.
Use un OPcache
Dado que PHP es un lenguaje interpretado, no compilado, el tiempo de ejecución de PHP necesita convertir el código fuente en código de bytes ejecutables, antes de que pueda ejecutarse. Y como PHP es una arquitectura de nada compartido, este proceso debe ocurrir en cada solicitud.
Sin embargo, con una caché de Opcode (OPcache), este paso solo tiene que ocurrir una vez para cada archivo, ya que los Opcodes generados se pueden almacenar en caché en memoria compartida y hacer referencia allí en su lugar.
Así que, como se puede imaginar, un OPcache es una de las formas menos intensivas de mejorar el rendimiento de una aplicación PHP, porque no es necesario cambiar el código. Algunos informes muestran una mejora de velocidad de hasta un 70%.
Ha habido varios cachés de código operativo para PHP a lo largo de los años. OPcache (anteriormente Zend Cache) se ha incluido con PHP desde la versión 5.5 y está habilitado por defecto en PHP 7.
Para obtener más información, consulte la documentación de OPcache. Para saber más sobre OPcache de ajuste de rendimiento, echa un vistazo al excelente artículo de Hayden James, así como al post de Tideway sobre afinarlo.
Utilice la precarga de PHP 7
Si aún no ha oído hablar de la nueva función de precarga de PHP 7.4, ¡es muy genial! En pocas palabras, la función lleva la funcionalidad de Opcache más allá de lo que nunca ha ido.
Para recapitular rápidamente, la primera vez que se encuentra un archivo fuente PHP, tiene que ser analizado, luego compilado en bytecode dependiente de la máquina, antes de que el motor de Zend pueda ejecutarlo. Los Opcaches reducen significativamente la sobrecarga de este proceso, ya que después de la primera vez que se analiza y compila el código fuente, los bytecodes se almacenan en una caché de Opcode en memoria compartida.
La próxima vez que se encuentre una solicitud para ese archivo, PHP comprueba si la caché de Opcode tiene códigos de bytes para el archivo. Si lo hace, se devuelven y se usan. Si no es así (o si el archivo de origen ha cambiado desde que se compilaron los bytecodes), el archivo de origen se analiza, compila y almacena en caché. Esto le da un notable aumento de rendimiento a PHP.
Ahora, veamos cómo funciona la precarga. Para citar el RFC de implementación:
Al iniciar el servidor, antes de ejecutar cualquier código de aplicación, podemos cargar un cierto conjunto de archivos PHP en la memoria y hacer que su contenido esté “permanentemente disponible” para todas las solicitudes posteriores que serán atendidas por ese servidor. Todas las funciones y clases definidas en estos archivos estarán disponibles para las solicitudes de forma inmediata, exactamente como las entidades internas. La precarga garantiza que:
- Todas las funciones y la mayoría de las clases definidas en estos archivos se cargarán permanentemente en las tablas de funciones y clases de PHP y estarán disponibles permanentemente en el contexto de cualquier solicitud futura.
- PHP resuelve dependencias de clase y enlaces con padre, interfaces y rasgos (algo que no sucede con el almacenamiento en caché de código operativo).
- PHP elimina inclusiones innecesarias y realiza otras optimizaciones.
Al tener el código de una aplicación completa, incluido su marco (como Zend Expressive, Symfony y Laravel) precargado en la memoria, código que solo cambia al reiniciar el servidor, la mayoría de las aplicaciones funcionarán significativamente mejor.
Dicho esto, la precarga tiene algunos inconvenientes potenciales que debe conocer:
- Se requiere reiniciar el servidor cuando cambian los archivos de origen.
- La precarga no funcionará en entornos de alojamiento compartido.
- La precarga no funcionará cuando haya varias versiones de la misma aplicación.
La precarga no es mágica. Tanto el código como los procesos de implementación tendrán que ser refactorizados para aprovecharlos. Por ejemplo, alguien tendrá que desarrollar un script de cargador personalizado para determinar qué archivos cargar al iniciar el servidor, y ese script tendrá que ejecutarse al iniciar el servidor. En cualquier caso, es una mejora significativa, ¡en la que vale la pena invertir!
Use un generador de perfiles
Ahora para una opción que requerirá un poco más de trabajo que cualquiera de las cinco anteriores. A menudo, nos lanzamos e intentamos adivinar dónde están los cuellos de botella de rendimiento en nuestras aplicaciones, utilizando intuición y conjeturas educadas.
Aunque estos pueden funcionar, no son los enfoques más eficientes. En su lugar, podemos usar perfiles de código para analizar nuestro código y mostrar dónde están los cuellos de botella. Específicamente, ayudan a responder preguntas como las siguientes:
- ¿Cuántas veces se llamó a cada método?
- ¿Cuál fue el tiempo máximo de ejecución de cada método?
- ¿Cuál fue el tiempo medio de ejecución de cada método?
- ¿Cuántas veces se incluyó un archivo?
- ¿Qué ruta tomó una solicitud a través de una aplicación (desde el primer hasta el último archivo de código)?
Al profundizar en los resultados de un generador de perfiles, a menudo puede sorprenderse gratamente, aunque es más probable que se sorprenda, al descubrir que su aplicación está ejecutando rutas de código y clases que nunca esperó.
En función de la información del informe del generador de perfiles, usted y su equipo pueden comenzar a comprender mejor lo que está haciendo su aplicación y hacer refactorizaciones informadas para cambiarla, según y donde sea necesario.
Si acaba de empezar a crear perfiles, hay varias opciones disponibles para PHP. Los más utilizados son:
- Xdebug del analizador
- canal de marea del XHProf extensión (& XHGui)
- spx Analizador
- forp
En Conclusión
Y esos son cinco maneras de mejorar la calidad de sus aplicaciones PHP en particular. Cualquiera de ellos por su cuenta le proporcionará una mejora notable del rendimiento. Sin embargo, cuando se usan juntos, debe esperar ver una mejora significativa del rendimiento, por no mencionar la calidad.
Leave a Reply