Conceptos básicos y Ejecución de PHP desde Apache

Servidores Web

Imanol Romera

  Php, Servidores Web

Como desarrolladores web, sabemos que PHP es el lenguaje más utilizado en nuestro gremio. Cuando hacemos deploy de un proyecto solemos utilizar una arquitectura llamada LAMP.

  • L – Linux. Un servidor linux, por facilidad de uso Debian o Ubuntu.
  • A – Apache. Un software que recibe conexiones HTTP(s) y devuelve datos al cliente.
  • M – MariaDB/MySQL. Una base de datos relacional para guardar todos los datos de la aplicación.
  • P – PHP. Un lenguaje de programación diseñado en un principio para producir HTML dinámico, pero que se utiliza actualmente de diversas maneras.

Cuando un servidor (la máquina) recibe una petición, el sistema operativo lo pasa al proceso que está escuchando en el puerto del protocolo utilizado (HTTP(s): 80/443).

En este caso, ese proceso es el servidor web Apache. Lo tenemos configurado para que redirija una URL coincidente a un documento. Este documento puede ser estático (imágenes, texto…) o puede ser el punto de entrada de nuestra aplicación.

Workers de Apache

En este punto, apache pasa nuestra petición al proceso de PHP a la espera de su tratamiento y posterior devolución al cliente. En esta sección detallaremos los modulos para procesar contenido dinámico en Apache.

Prefork

Utilizando este worker se crea un proceso nuevo de PHP por cada petición. Naturalmente, es el mas lento en tiempo de respuesta y el que mas consumo de RAM y CPU presenta. El tiempo «perdido» se emplea en arrancar otro proceso de PHP . Hay que pensar también que PHP tiene unos módulos cargados, que también suman RAM por cada proceso.

El punto positivo de este worker es que es el más estable debido a su rudimentariedad, pero es el que mas recursos consume.

Worker

Se crean varios hilos por proceso para que un unico proceso maneje varias peticiones a la vez. Solo se consume RAM de los modulos PHP una vez por proceso padre. Emplea menos CPU y RAM. El gran inconveniente es que si se produce un error 500 (error fatal en la aplicación), todos los otros hilos terminan anormalmente, aunque fuesen a funcionar correctamente.

Se comporta bastante peor ante fallos aunque consume menos CPU y RAM.

Event

Una mejora del worker en todos los sentidos pero que principalmente optimiza conexiones persistentes como descargas, y si se usa con php-fpm soluciona el problema del control de errores de Worker.

Ejecución de PHP

Si los workers describen la forma de crear procesos de apache donde se controlan las peticiones, los modulos de ejecución de PHP hacen precisamente eso, interpretar nuestro código PHP.

mod_php

Esto es un módulo de Apache. Cuando lo habilitamos, apache detecta cualquier archivo PHP y lo procesa internamente. Podemos decir que se carga el interprete de PHP dentro de Apache.

Está habilitado por defecto en Apache, pero presenta el inconveniente de mayor uso de RAM, y si se produce un error en PHP puede llegar a colapsar el proceso de Apache.

Además, aunque sea una petición de contenido estático, el proceso de apache siempre carga el modulo de PHP. Por esto, no es recomendable para sitios con mucho tráfico.

PHP-FPM

Terminal de Linux

Primero, un poquito de historia.

CGI es una interfaz para permitir la comunicacion entre dos procesos, que en este caso serían Apache y PHP. Su rendimiento es relativamente pobre para sitios con mucho tráfico y ha sido reemplazado por FastCGI.

FastCGI es una mejora de CGI en el ámbito del rendimiento y es relativamente facil de adaptar a servidores con múltiples versiones de PHP.

PHP-FPM es una implementación de FastCGI en el proceso de PHP. Está aún mas optimizado. Crea hilos dinámicamente durante su ejecución. El sistema operativo se puede configurar para arrancar el proceso de PHP-FPM automaticamente junto a Apache.

Ya que es un único proceso padre, solo se consume la RAM de los módulos PHP una única vez. Además, el proceso siempre está a la espera de peticiones entrantes de Apache, con lo cual se reduce el tiempo de respuesta de las peticiones.

Como desventaja, se podría decir que es ligeramente mas dificil de configurar.

Conclusiones

Como programadores, cuando desarrollamos en nuestra estación de trabajo preferimos instalar las herramientas en su configuración por defecto, con lo cual entiendo que hay un mercado de uso para Apache prefork + mod_php. Al ser una máquina aislada no se nos presenta la desventaja de saturar el servidor a peticiones e incrementar exponencialmente el uso de recursos.

Pero, para un entorno de producción que recibe múltiples peticiones por segundo donde cada milisegundo y los recursos de la máquina cuentan, renta configurar Apache event + php-fpm.