Diferencias modo ejecución PHP

De sobras es sabido que PHP puede ejecutarse de mil y una manera Fast-CGI, CGI, Mod-PHP, FPM, SuPHP, suEXEC ….

¿Pero que diferencia hay entre uno y otro?

mod_php (DSO)

DSO (que es la abreviatura de objeto dinámico compartido) o mod_php es el más antiguo y, algunos dirían, el controlador PHP más rápido disponible. Esencialmente hace PHP parte de Apache. Esto también es el más fácil de configurar, aunque tiene un gran contra y es que se ejecuta como Apache y no como el dueño del sitio web, por lo que es facilmente vulnerable, teniendo que usar de esta forma ficheros 777 para que puedan ser leidos, con el consiguiente problema que eso conlleva.

CGI

En lugar de ejecutar el código de PHP Apache ahora se ejecuta como un proceso CGI. Es decir, en un programa fuera de tu servidor Apache.
Se ejecuta el php como un software externo, cada ejecución del cgi abre y cierra el entorno de ejecución entero. Mediante este tipo de ejecución tenemos el problema de mod_php de un solo usuario para todo pero podemos utilizar el módulo suexec de apache para que se ejecute con los permisos del propietario del cgi.

FastCGI

FastCGI es el último controlador principal de PHP (mejor opción para entornos multi-usuario). Ofrece los beneficios de la seguridad de suPHP mediante la ejecución de archivos como el propietario del archivo. Esto utiliza más memoria que suPHP, pero también es mucho más rápido, y es propio para sitios webs con alto volumen de tráfico.

NOTA: CGI vs FastCGI –> En vez de crear procesos nuevos por cada petición, FastCGI puede usar un solo proceso persistente el cual maneja cualquier petición durante su periodo de vida.

suPHP

suPHP se ejecuta fuera de la secuencia de comandos de Apache como CGI. Pero secuencias de comandos se ejecutará como otro usuario que el usuario de Apache (presumiblemente el usuario propietario de los archivos).

Esto significa que puedes subir archivos desde dentro de su aplicación web utilizando suPHP. Además, porque tu PHP se ejecuta como un usuario diferente cualquier vulnerabilidad en su sitio puede ser restringida a sólo algunos archivos.
Es muy seguro, aunque no es tan rápido como FastCGI por ejemplo. Es propio para sitios webs con poco tráfico.

Igual que CGI pero permite ejecutar el cgi con los permisos del propietario del cgi sin utilizar ningún módulo de apache como suexec. Por contra consume una cantidad considerable de CPU y no se pueden utilizar sistemas de opcode caching(en cada petición se recompila el código en PHP, no cachea), debido a esta limitación se ha convertido en una opción descartable en la mayoría de escenarios.

SuExec

Módulo de apache que nos permite ejecutar php con el usuario indicado, sí que permite opcode caching, solo es compatible con la ejecución de phps mediante cgi/fast-cgis. SuExec no es requerido para correr con cgi-scripts, pro es realmente una buena idea si tu tienes multiples sitios webs sirviendo peticiones

SuExec posee varios parámetros que nos permiten afinar el comportamiento de los phps:

  • SUEXEC_SAFEPATH: Default PATH for suexec (default: /usr/local/bin:/usr/bin:/bin)
  • SUEXEC_LOGFILE: Path to the suexec logfile (default: /var/log/apache2/suexec_log)
  • SUEXEC_CALLER: Name of the user Apache is running as (default: apache)
  • SUEXEC_DOCROOT: Directory in which suexec will run scripts (default: /var/www)
  • SUEXEC_MINUID: Minimum UID, which is allowed to run scripts via suexec (default: 1000)
  • SUEXEC_MINGID: Minimum GID, which is allowed to run scripts via suexec (default: 100)
  • SUEXEC_USERDIR: User subdirectories (like /home/user/html) (default: public_html)
  • SUEXEC_UMASK: Umask for the suexec process (default: 077)

PHP-FPM

(FastCGI Process Manager): Versión mejorada de fastcgi, permite recargar la config de php en caliente, reinicio de los procesos sin destruir la caché del opcode entre otras funcionalidades, por supuesto es compatible con suexec.

  • está pensado para funcionar en sitios con gran carga
  • funciona como demonio independiente, aislando la capa de aplicación del servidor web
  • permite separar fisicamente la ejecución del contenido web dinámico.

En esta tabla se ven un poco mas clara las diferencias:

Comparación métodos ejecución php
mod_php CGI FastCGI suPHP
Memory usage Low Low High Low
CPU Usage Low High Low High
Security Low Low High High
Run as file owner No No Yes Yes
Overall Performance Fast Slow Fast Slow

 

Además del método de ejecución de php debemos tener en cuenta el gestor de hilos de apache(mpms):

  • worker –> Escalabilidad y concurrencia, además recomendado si se utiliza SSL. La única pega es que necesita mantener un thread por cada conexión establecida hasta que se cumpla el timeout, aunque no se genere tráfico. Arranca varios procesos y cada uno de ellos varios threads.
  • prefork(default Unix) –> Estabilidad y retrocompatibilidad, adecuado cuando se utilizan librerías que no soportan threading(como mod_php). Arranca un nuevo proceso por petición.
  • itk –> Es experimental y muy parecido a prefork, hace un chroot en cada fork, mas seguro pero mas pesado, cada vhost se ejecuta con un uid y gid determinado.
  • peruser(abandonado desde el 2004) –> Cada hijo de apache corre con su UID y GID, chrootea procesos de apache, por contra no se recomienda utilizarlo en producción, rompe SSL y no es muy escalable.
  • event –> Como worker pero un solo thread se encarga de todas las conexiones que no generan tráfico, recomendado cuando el tráfico de los clientes es puntual, es considerado inestable.
    Combinaciones mpm, modos ejecución
    MPM Modo ejecución
    worker CGI/FastCGI con o sin suexec
    prefork mod_php
    itk mod_php
    peruser mod_php
    event CGI/FastCGI con o sin suexec

¡Déjanos una respuesta!