Vi diferentes binarios para PHP, como no subprocesos o seguros para subprocesos.

¿Qué significa esto?

¿Cuál es la diferencia entre estos paquetes?

ตอบ

Antecedentes necesarios sobre enfoques de concurrencia:

Los diferentes servidores web implementan diferentes técnicas para manejar las solicitudes HTTP entrantes en paralelo. Una técnica bastante popular es el uso de subprocesos, es decir, el servidor web creará / dedicará un solo subproceso para cada solicitud entrante. El servidor web Apache HTTP admite múltiples modelos para manejar solicitudes, uno de los cuales (llamado MPM trabajador) usa subprocesos. Pero admite otro modelo de concurrencia llamado prefork MPM que usa procesos, es decir, el servidor web creará / dedicará un solo proceso para cada solicitud.

También existen otros modelos de concurrencia completamente diferentes (que utilizan sockets asíncronos y E / S), así como también aquellos que mezclan dos o incluso tres modelos juntos. Con el fin de responder a esta pregunta, solo nos interesan los dos modelos anteriores y tomamos el servidor HTTP Apache como ejemplo.

Antecedentes necesarios sobre cómo PHP se "integra" con los servidores web:

PHP en sí mismo no responde a las solicitudes HTTP reales; este es el trabajo del servidor web. Así que configuramos el servidor web para reenviar solicitudes a PHP para su procesamiento, luego recibimos el resultado y se lo enviamos 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 en sí mismo, pero 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 su pregunta.

Es posible que no haya necesitado comprender estos detalles antes, porque las empresas de alojamiento 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 Worker MPM (es decir, usando Threads), entonces PHP debe poder operar dentro de este mismo entorno de múltiples subprocesos, lo que significa que PHP tiene que ¡Sea seguro para los subprocesos para poder jugar correctamente a la pelota 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 el pensamiento correcto. Sin embargo, da la casualidad de 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 usar PHP en un entorno de subprocesos múltiples si tiene la opción.

Hablando solo de entornos basados ​​en Unix, diría que, afortunadamente, solo tiene que pensar en esto si va a usar PHP con el servidor web Apache, en cuyo caso se recomienda que elija 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 de 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 preguntarle para una elección. 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 fueradel servidor web con múltiples procesos PHP utilizados para responder solicitudes a través de, por ejemplo, FastCGI. Para tales casos, la seguridad de los subprocesos tampoco importa. Para ver qué versión está usando su sitio web, coloque un archivo que contenga <?php phpinfo(); ?>en su sitio y busque la Server APIentrada. Esto podría decir algo como CGI/FastCGIo 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 para subprocesos no importa, entonces, ¿qué versión debería usar, la segura para subprocesos o la no segura para subprocesos? Francamente, ¡no tengo una respuesta científica! Pero supongo que la versión no segura para subprocesos es más rápida y / o con 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 una versión no segura para subprocesos porque siempre uso nginx o ejecuto PHP desde la línea de comandos.

La versión no segura para subprocesos debe usarse si instala PHP como un binario CGI, interfaz de línea de comandos u otro entorno donde solo se usa un único subproceso.

Se debe usar una versión segura para subprocesos si instala PHP como un módulo de Apache en un MPM de trabajo (modelo de multiprocesamiento) u otro entorno donde se ejecutan varios subprocesos de PHP al mismo tiempo.

Se utiliza el prefork Apache MPM con modphp porque es fácil de configurar / instalar. En cuanto al rendimiento, es bastante ineficiente. Mi forma preferida de hacer la pila, FastCGI / PHP-FPM. De esa manera, puede utilizar MPM Worker, mucho más rápido. Todo PHP permanece sin subprocesos, pero Apache sirve con subprocesos (como debería).

Básicamente, de abajo hacia arriba

Linux

Apache + MPM Worker + ModFastCGI (NO FCGI) | (o) | Cherokee | (o) | Nginx

PHP-FPM + APC

ModFCGI no es compatible correctamente con PHP-FPM ni con ninguna aplicación FastCGI externa. Solo admite scripts FastCGI no gestionados por procesos. PHP-FPM es el administrador de procesos PHP FastCGI.

Según la documentación de PHP ,

¿Qué significa la seguridad de subprocesos al descargar PHP?

Thread Safety means that binary can work in a multithreaded webserver context, such as Apache 2 on Windows. Thread Safety works by creating a local storage copy in each thread, so that the data won't collide with another thread.

So what do I choose? If you choose to run PHP as a CGI binary, then you won't need thread safety, because the binary is invoked at each request. For multithreaded webservers, such as IIS5 and IIS6, you should use the threaded version of PHP.

Las siguientes bibliotecas no son seguras para subprocesos. No se recomiendan para su uso en un entorno de subprocesos múltiples.

  • SNMP (Unix)
  • mSQL (Unix)
  • IMAP (Win / Unix)
  • Sybase-CT (Linux, libc5)