Checklist de Optimización de Aplicaciones PHP

PHP es el enguaje de programación más usado en el mundo de aplicaciones Web del lado del servidor. Es utilizado por Facebook, Wikipedia, Pinterest, entre otros sitios con más visitas en Internet.

Preámbulo

Para los desarrolladores, PHP es una plataforma atractiva pues reduce tiempo de compilación, hay muchos frameworks que simplifican la creación de aplicaciones y dispone de una enorme comunidad de usuarios que simplifican el hallazgo de técnicas y problemas comunes.

Para los administradores de plataforma de operación, PHP es un lenguaje fácil de soportar y configurar. Es el lenguaje más común entre proveedores de servicios de alojamiento y ofrece mayor compatibilidad con sistemas operativos, bases de datos y servidores Web.

No obstante, por la naturaleza del lenguaje de programación mismo, puede ser una plataforma que consuma muchos recursos de procesamiento lo cual compromete el rendimiento, tiempo de respuesta y escalabilidad, principalmente para aplicaciones con alta demanda.

Este artículo presenta varias recomendaciones para la optimización y escalabilidad de aplicaciones Web con PHP en general, obtenidas a partir de la experiencia en Alkaid, considerando los componentes que por lo general conforman la solución e independientemente del proveedor de servicio de infraestructura.

El propósito siempre será reducir el tiempo de respuesta de la aplicación al usuario final (TTFB), preferiblemente siempre menor a los 2 segundos. Esto impactará en una mayor satisfacción al usuario, más productividad, más capacidad, aprovechamiento de recursos y escalabilidad del servicio.

1. CPU y RAM

Este es definitivamente el componente de optimización más importante. Cualquier operación de procesamiento en la arquitectura de la solución tendrá que pasar por hardware, siendo el principal cuello de botella.

El ciclo de ejecución de una aplicación PHP requiere la carga de la misma en memoria RAM, el parsing del lenguaje, la compilación y ejecución del mismo. Más memoria RAM significa más capacidad para múltiples procesos mientras que más CPU significa tiempos de ejecución menores.

Sin temor y de acuerdo a la demanda de la aplicación, invierta bastante en CPU y Memoria RAM, cubriendo las expectativas de capacidad. Una buena inversión en hardware le puede ahorrar arquitecturas complejas y niveles de optimización más profundos.

2. Almacenamiento

Debido a que PHP es un lenguaje interpretado, el entorno de ejecución requiere que por cada solicitud múltiples ficheros de PHP sean leídos desde el almacenamiento y cargados en memoria RAM para preparar su ejecución.

Dependiendo del framework y la complejidad de la aplicación, estamos hablando de 10 a 2.000 ficheros, incluyendo librerías, imágenes y archivos de código fuente, que son cargados desde disco continuamente, siendo así una variable fundamental en el tiempo de respuesta final del servicio que podría ahorrar centenares de milisegundos.

Si su almacenamiento es lento, su aplicación definitivamente será lenta. Prefiera siempre Discos Duros de Estado Sólido (SSD), controladores de disco de mayor velocidad junto con sistemas de archivos optimizados para lectura de ficheros pequeños. A la vez emplee servicios de caché de ficheros localmente, como cachefilesd, cuando el almacenamiento esté montado sobre red (NFS, AFS, SMB).

3. BD y Servicios

Por lo general las aplicaciones Web interoperan con otros sistemas para gestionar los datos de la aplicación o ejecutar funciones más especializadas, que podrían ser claves en la ruta crítica del tiempo de respuesta a una solicitud Web.

Este componente incluye, por ejemplo, motores de base de datos relacionales, bases de datos NoSQL, API's de Servicio REST o SOAP, Programas de Aplicación, comunicación por Sockets, entre otros. MySQL y MariaDB son motores de BD por lo general óptimos para lecturas.

Cada servicio adicional es visto como otra línea de producción y por tanto debe preocuparse por su optimización de forma particular. Refiérase a cada producto o servicio por aparte procurando que responda rápidamente mientras reduce también el numero de solicitudes a estos servicios al máximo.

4. Caché Opcode

A diferencia de lenguajes que son compilados y producen código intermedio o de máquina, los ficheros de una aplicación PHP por lo general permanecen como código fuente y son interpretados al momento de su ejecución.

Esto en definitiva requiere un mucho mayor esfuerzo de lectura desde el sistema de almacenamiento y más procesamiento de CPU. Por tanto, existen diferentes alternativas para mejorar este desempeño mantenimiento la aplicación en código binario, conocido como "opcode"

Recomiendo el uso de APC para versiones iguales o inferiores a PHP 5.4, o Zend Opcache para versiones iguales o superiores a PHP 5.5, que mantiene el código de PHP precompilado en memoria RAM reduciendo el acceso a disco y la carga de CPU. He obtenido varios segundos de mejora principalmente donde el almacenamiento de los ficheros de aplicación es más lento.

5. Caché HTML

Cada solicitud HTTP a una aplicación Web en PHP con frecuencia implica varias consultas a base de datos y generación del código HTML que se enviará al navegador. Es posible almacenar el código HTML en una caché para reducir el procesamiento y entregar una respuesta realmente rápido.

Este mecanismo se puede lograr de múltiples formas. La primera consiste en emplear colocar un servidor Proxy Caché Reverso frente a la aplicación pero en el mismo servidor, como Nginx, Varnish o Squid, entre otros, que sean quienes administren la caché por su cuenta.

Otra forma es usar las característica de caché soportadas nativamente en los CMS como Joomla!, Drupal, o a través de varios plugins alternativos disponibles también para Wordpress. Es recomendable que los tiempos de expiración no sean muy largos para que el contenido se pueda refrescar pronto.

6. Framework o CMS

Aunque realmente no es necesario, un desarrollador no suele partir de cero, sino que emplea un framework que brinda las bases para la creación de su aplicación. PHP es quizá el lenguaje de programación con más frameworks y CMS disponibles.

El diseño de software de cada framework es particular, por lo cual debe elegir uno que de antemano no impacte el rendimiento. A su vez, cada framework o CMS posee plugins o características propias de optimización que debe revisar.

Por su popularidad, Joomla!, Drupal y WordPress son los CMS más usados para crear portales Web, y en ese respectivo orden son evaluados por su desempeño. Yii y Laravel son frameworks de aplicaciones Web muy populares y destacados por su desempeño también. Magento es usado popularmente para E-commerce pero es más lento en general.

7. Balanceador

Use un balanceador de carga si requiere distribuir la carga de trabajo entre uno o mas servidores, o porque requiere tener la posibilidad de escalar la capacidad para soportar la demanda con mayor facilidad. También contribuye a aumentar la disponibilidad del servicio.

Un balanceador simplemente es un servidor Web Proxy Reverso cuya función es recibir las solicitudes de los usuarios y distirbuirlas entre los nodos que finalmente realizan el procesamiento de la solicitud y retornan la respuesta. Le recomiendo Nginx o Varnish, ampliamente usados a nivel mundial.

Los balanceadores Web normalmente cuentan con la opción de cachear el contenido de respuesta a las solicitudes, reduciendo la carga de trabajo en los nodos de procesamiento. Otra función usual, es almacenar el contenido estático en estos, dedicando los nodos únicamente a procesamiento de aplicación.

8. Servidor Web

Es el muy conocido servicio que escucha solicitudes HTTP, las procesa y emite una respuesta. Por tanto, en una aplicación PHP, es quien asume la responsabilidad de saber qué hacer cuando recibe una solicitud que debe ser primero procesada por el entorno de ejecución de PHP.

Hay distintas formas en que los servidores Web deciden qué hacer con las solicitudes que esperan ser ejecutadas por PHP. Algunas configuraciones de servidor deciden crear un proceso independiente por cada solicitud, otras mantienen módulos en memoria para ejecutar hilos y hay otras que prefieren delegar la solicitud a un servidor especializado en PHP.

Cada uno de estos modelos tiene su impacto en el rendimiento del servicio. En nuestro caso, hemos encontrado un óptimo desempeño al usar la combinación de servidor Web Nginx (basado en eventos) junto con el gateway PHP-FPM, especializado en procesamiento de solicitudes PHP, que mantiene un "pool" de procesos de PHP listos para hacer su trabajo.

Otras Sugerencias

Puede que algunos problemas de optimización se encuentren en el diseño de software que usted creó y no en la pila tecnológica, por lo cual puede usar depuradores, profilers y otros métodos para analizar los tiempos de ejecución de sus algoritmos.

Con el propósito de asegurar que las aplicaciones PHP están operando con buen desempeño, es altamente recomendado emplear algún servicio de monitoreo que al menos le informe de códigos de error HTTP y tiempos de respuesta. 

Por otro lado, realice una inspección de registros de error de los servidores Web con frecuencia. En muchas ocasiones acontecen problemas que no son evidentes a simple vista y que pueden causar un alto consumo de recursos.

BLOG COMMENTS POWERED BY DISQUS