Modos de ejecución de PHP
Suele ser bastante habitual hablar de PHP, o incluso programar con él, sin conocer realmente las posibilidades o características que nos brinda. Una de ellas que no suele estar muy clara son los distintos modos de funcionamiento de PHP que podemos configurar en nuestros servidores. No los voy a revisar todos, pero si al menos los más importantes.
Al modo de ejecución de PHP se le denomina handler y no hace más que especificar la manera en la que Apache se va a comunicar con PHP. Tenemos las siguientes:
mod_php (DSO)
mod_php DSO (Dynamic Shared Object), es el modo más antiguo de funcionamiento. Aquí PHP funciona como módulo de Apache y lo que estamos permitiendo es que el mismo Apache pueda interpretar scripts PHP, es decir, el interprete de PHP está embebido dentro del propio proceso de Apache lo cual hace que la comunicación entre Apache y PHP sea mejor y más efectiva. Además, implica que PHP solo arranca, carga y configura una única vez (cuando Apache se inicia) y puede almacenar información en todas las sesiones. Los scripts de PHP son ejecutados directamente por el usuario nobody de Apache lo cual puede causar problemas de permisos de archivos ya que los que se suben al servidor pertenecen a este usuario nobody.
Ventajas: Es el modo más rápido de ejecución al no necesitar ningún programa externo lo que lo hace bueno para sitios web que necesiten alto rendimiento. La configuración PHP puede ser configurada sin necesitar de archivos .htaccess
Desventajas: Cualquier cambio que hagamos en la configuración de PHP (php.ini) requerirá reiniciar el servidor web. Apache se vuelve un proceso más grande en el sistema y consume más recursos. Con este modo, estamos cargando el interprete de PHP aún cuando estemos generando contenido que tenga únicamente HTML.
CGI
Common Gateway Interface, define un estándar por el que un sevidor web (Apache, por ejemplo), se comunica con una aplicación externa a él. Ojo, aquí el significado de externa no es ‘otro servidor físico’, sino que la ‘aplicación externa’ físicamente también está implementada en el mismo servidor que el servidor web. En este modo de funcionamiento PHP no se ejecuta dentro de Apache sino que lo hace ‘fuera de él’ en un proceso que el mismo lanza (llamando al ejecutable de PHP, por ejemplo) y que es reconocido como un proceso CGI. Es decir, ahora seguimos teniendo Apache como servidor web, pero la petición es realmente resuelta por un programa externo a él que puede estar escrito en el mismo PHP, Perl, o cualquier otro lenguaje de propósito general tanto interpretado como compilado.
Los scripts también se ejecutan bajo el usuario de Apache ‘nobody’, aunque si instalamos el módulo suexec podemos proporcionarle a Apache la posibilidad de ejecutar aplicaciones CGI con otros usuarios diferentes al del servidor web como por ejemplo el usuario del sitio o el de una cuenta de usuario específica.
Ventajas: La principal ventaja es que al ser un proceso externo al servidor web, podemos tener un nivel de seguridad mayor. Suponiendo que usamos PHP como CGI, si realizamos un cambio en la configuración (php.ini), dicho cambio se hará efectivo con la siguiente petición web.
Desventajas: respecto al modo de funcionamiento mod_php es la velocidad con un rendimiento muy pobre. Además, las soluciones de caché opcode no funcionan con CGI.
FastCGI
Este modo fue desarrollado e introducido para evitar problemas ejecutando aplicaciones PHP dentro de un proceso de Apache y, además, evitar los problemas de rendimiento de CGI.
Una aplicación FastCGI es ejecutada fuera del servidor web y se mantiene a la espera de más peticiones del servidor web utilizando un socket. Es decir, de la misma forma que con CGI se está lanzando una aplicación externa (ejecutable de PHP por ejemplo) pero en este caso no se lanza una vez por petición, sino que se mantiene una única ejecución persistente para todas las peticiones, lo que aumenta considerablemente el rendimiento.
Una de las grandes ventajas de este modo, es que al existir una comunicación por un socket, ahora el servidor web y la aplicación FastCGI pueden estar en servidores físicos distintos y comunicarse a través de la red. Además, también puede usar caché opcode como APC gracias a que mantiene los procesos de forma persistente.
suPHP
suPHP es un módulo de Apache que también ejecuta los scripts de PHP como CGI. Según la web, este módulo ya no se actualiza de manera oficial.
suPHP is not maintained any longer and will not receive any further updates not even security patches. If you want to continue using suPHP, feel free to create a fork (the complete code is licensed under the GPL version 2).
If you are looking for an alternative, have a look at php-fpm.
suPHP ejecuta los scripts PHP con los permisos del usuario propietario. Es bastante más lento que mod_php y que CGI. Es seguro utilizarlo desde el punto de vista que se puede saber que usuario es el que ha ejecutado un script. Es típico el uso en servidores compartidos ya que cualquier script que no pertenezca al usuario del dominio no puede ejecutarse.
Al igual que CGI, no funciona con opcode ya que con cada peticion se ejecuta un proceso PHP.
PHP-FPM
PHP-FPM (PHP FastCGI Process Manage), es una implementación mejorada de FastCGI que la hace mejor para sitios con alto tráfico. Permite que un servidor pueda establecer cantidades específicas de recursos para procesar las solicituces que reciba. Es más rápido que suPHP para entornos multi-usuario.
Incluye, por ejemplo, un manejo para detener/arrancar procesos de forma fácil, cambiar la configuración de PHP ‘en caliente’, posibilidad de iniciar hilos de procesos con diferentes uid/gid/chroot/environment y escuchar en diferentes puertos, usar distintos php.ini, scripts de registro de procesos inusualmente lentos, reiniciar procesos sin destruir la caché opcode…etc.
Esto es todo. Cualquier comentario o sugerencia será bienvenida.
¡Chimpún!
Bibliografía
- Sergio Luján, “Programación de servidores CGI, SSI, IDC”. La imagen del esquema CGI fue tomada de este PDF enlazado.
- https://www.open6hosting.com/modosejecucionphp/
- https://es.wikipedia.org/wiki/FastCGI
- http://php.net/manual/es/install.fpm.php
- https://ampmhosting.com.ar/2014/09/12/configurando-php-modphp-dso-suphp-cgi-fastcgi-suexec-cual-elegir/
- https://httpd.apache.org/docs/2.4/suexec.html
- http://php.net/manual/es/install.fpm.php
- https://documentation.cpanel.net/display/60Docs/PHP-FPM+and+EasyApache+4
- https://www.chriswiegman.com/2011/10/fastcgi-vs-suphp-vs-cgi-vs-mod_php-dso/