¿Qué es seguro para subprocesos o no seguro para subprocesos en PHP?
Vi diferentes binarios para PHP, como sin subprocesos o seguros para subprocesos.
¿Qué quiere decir esto?
¿Cuál es la diferencia entre estos paquetes?
Antecedentes necesarios sobre enfoques de concurrencia:
Diferentes servidores web implementan diferentes técnicas para manejar solicitudes HTTP entrantes en paralelo. Una técnica bastante popular es el uso de subprocesos, es decir, el servidor web creará/dedicará un único subproceso para cada solicitud entrante. El servidor web Apache HTTP admite múltiples modelos para manejar solicitudes, uno de los cuales (llamado trabajador MPM) utiliza subprocesos. Pero admite otro modelo de concurrencia llamado MPM prefork que utiliza procesos, es decir, el servidor web creará/dedicará un único proceso para cada solicitud.
También existen otros modelos de concurrencia completamente diferentes (que utilizan sockets asíncronos y E/S), así como otros que combinan dos o incluso tres modelos. Para responder a esta pregunta, solo nos ocuparemos de los dos modelos anteriores y tomaremos el servidor HTTP Apache como ejemplo.
Se necesitan conocimientos sobre cómo PHP se "integra" con los servidores web:
PHP en sí no responde a las solicitudes HTTP reales; este es el trabajo del servidor web. Entonces configuramos el servidor web para reenviar solicitudes a PHP para su procesamiento, luego recibimos el resultado y lo enviamos de regreso al usuario. Hay varias formas de encadenar el servidor web con PHP. Para el servidor HTTP Apache, el más popular es "mod_php". Este módulo es en realidad PHP, pero está compilado como un módulo para el servidor web, por lo que se carga directamente dentro de él.
Existen otros métodos para encadenar PHP con Apache y otros servidores web, pero mod_php es el más popular y también servirá para responder a tu pregunta.
Quizás no hayas necesitado entender estos detalles antes, porque las empresas de hosting y las distribuciones GNU/Linux vienen con todo preparado para nosotros.
¡Ahora, a tu pregunta!
Dado que con mod_php, PHP se carga directamente en Apache, si Apache va a manejar la concurrencia usando su MPM de trabajo (es decir, usando subprocesos), entonces PHP debe poder operar dentro de este mismo entorno de subprocesos múltiples, es decir, PHP tiene que ¡Sea seguro para subprocesos para poder jugar correctamente con Apache!
En este punto, deberías estar pensando "OK, entonces si estoy usando un servidor web multiproceso y voy a incrustar PHP directamente en él, entonces debo usar la versión segura para subprocesos de PHP". Y este sería un pensamiento correcto. Sin embargo, resulta que la seguridad de los subprocesos de PHP es muy controvertida . Es un terreno útil si realmente sabes lo que estás haciendo.
Notas finales
En caso de que se lo pregunte, mi consejo personal sería no utilizar PHP en un entorno multiproceso si tiene la opción.
Hablando sólo de entornos basados en Unix, diría que afortunadamente, sólo tienes que pensar en esto si vas a utilizar PHP con el servidor web Apache, en cuyo caso te recomendamos usar el MPM prefork de Apache (que no usa subprocesos y, por lo tanto, la seguridad de los subprocesos de PHP no importa) y todas las distribuciones GNU/Linux que conozco tomarán esa decisión por usted cuando instale Apache + PHP a través de su sistema de paquetes, sin siquiera avisarle. para elegir. Si va a utilizar otros servidores web como nginx o lighttpd , no tendrá la opción de incrustar PHP en ellos de todos modos. Verá el uso de FastCGI o algo similar que funcione en un modelo diferente donde PHP está totalmente fuera del servidor web con múltiples procesos PHP utilizados para responder solicitudes a través de, por ejemplo, FastCGI. En tales casos, la seguridad de los subprocesos tampoco importa. Para ver qué versión utiliza su sitio web, coloque un archivo que contenga <?php phpinfo(); ?>
su sitio y busque la Server API
entrada. Esto podría decir algo como CGI/FastCGI
o Apache 2.0 Handler
.
Si también observa la versión de línea de comandos de PHP, la seguridad de los subprocesos no importa.
Finalmente, si la seguridad de subprocesos no importa, ¿qué versión debería usar: la segura para subprocesos o la que no es segura para subprocesos? Francamente, ¡no tengo una respuesta científica! Pero supongo que la versión que no es segura para subprocesos es más rápida y/o tiene menos errores, o de lo contrario simplemente habrían ofrecido la versión segura para subprocesos y no se habrían molestado en darnos la opción.
Para mí, siempre elijo la versión que no es segura para subprocesos porque siempre uso nginx o ejecuto PHP desde la línea de comandos.
La versión que no es segura para subprocesos debe usarse si instala PHP como un binario CGI, una interfaz de línea de comandos u otro entorno donde solo se usa un subproceso.
Se debe usar una versión segura para subprocesos si instala PHP como un módulo de Apache en un MPM (modelo de multiprocesamiento) de trabajo u otro entorno donde se ejecutan múltiples subprocesos de PHP simultáneamente; en pocas palabras, cualquier compilación CGI/FastCGI de PHP no requiere subprocesos. seguridad.