Pregunta ¿Qué es un hilo seguro o no seguro para subprocesos en PHP?


Vi diferentes binarios para PHP, como no hilo o hilo seguro? ¿Qué significa esto? ¿Cuál es la diferencia entre estos paquetes?


670
2017-10-26 09:41


origen


Respuestas:


Antecedentes necesarios sobre enfoques concurrentes:

Los diferentes servidores web implementan diferentes técnicas para manejar solicitudes HTTP entrantes en paralelo. Una técnica bastante popular es usar hilos, es decir, el servidor web creará / dedicará un único hilo para cada solicitud entrante. El servidor web HTTP de Apache admite varios modelos para gestionar solicitudes, uno de los cuales (llamado MPM worker) utiliza subprocesos. Pero admite otro modelo de simultaneidad denominado prefork MPM que utiliza procesos, es decir, el servidor web creará / dedicará un único proceso para cada solicitud.

También hay otros modelos de simultaneidad completamente diferentes (que usan sockets asíncronos y E / S), así como también aquellos que mezclan dos o incluso tres modelos juntos. Con el fin de responder esta pregunta, solo nos preocupan los dos modelos anteriores y tomar 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. Entonces, configuramos el servidor web para reenviar las solicitudes a PHP para su procesamiento, luego recibimos el resultado y lo enviamos al usuario. Hay varias formas de encadenar el servidor web con PHP. Para Apache HTTP Server, el más popular es "mod_php". Este módulo es en realidad PHP, pero compilado como un módulo para el servidor web, por lo que se carga 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 hosting y las distribuciones de GNU / Linux vienen con todo lo preparado para nosotros.

¡Ahora, a tu pregunta!

Dado que con mod_php, PHP se carga directamente en Apache, si Apache manejará la concurrencia usando su Worker MPM (es decir, usando Threads) entonces PHP debe poder operar dentro de este mismo entorno multihilo, es decir, ¡PHP tiene que ser seguro para subprocesos para poder jugar correctamente con Apache!

En este punto, debe pensar "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 esto sería un pensamiento correcto. Sin embargo, sucede que la seguridad de los hilos de PHP es muy disputado. Es un terreno de uso si realmente sabes lo que estás haciendo.

Notas finales

En caso de que se lo pregunte, mi consejo personal sería no ¡usa PHP en un entorno multihilo si tienes la opción!

Hablando solo de entornos basados ​​en Unix, diría que, afortunadamente, solo tienes que pensar en esto si vas a utilizar PHP con el servidor web Apache, en cuyo caso se te aconseja ir con el MPM prefork de Apache (que no usa subprocesos, y por lo tanto, la seguridad de subprocesos PHP no importa) y todas las distribuciones de GNU / Linux que conozco tomarán esa decisión cuando instale Apache + PHP a través de su sistema de paquete, sin siquiera incitarlo para una elección. Si vas a usar otros servidores web como nginx o lighttpd, no tendrá la opción de incrustar PHP en ellos de todos modos. Usted buscará usar FastCGI o algo igual que funciona en un modelo diferente donde PHP es totalmente fuera de del servidor web con múltiples procesos PHP utilizados para responder solicitudes a través, p. ej. FastCGI. Para tales casos, la seguridad de la hebra tampoco importa. Para ver qué versión está usando su sitio web, coloque un archivo que contenga <?php phpinfo(); ?> en su sitio y busque el Server API entrada. Esto podría decir algo como CGI/FastCGI o Apache 2.0 Handler.

Si también miras la versión de línea de comandos de PHP, la seguridad de los hilos no importa.

Finalmente, si la seguridad de la hebra no es importante, ¿qué versión debe usar? ¿Es seguro para la ejecución de subprocesos o no 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 menos problemática, o de lo contrario habrían ofrecido la versión segura para subprocesos y no se han molestado en darnos la opción.


588
2018-05-12 13:37



UN a salvo de amenazas versión debe ser utilizada si instala PHP como un Módulo de Apache, como MPM de trabajador (modelo de multiprocesamiento).

los No seguro para subprocesos versión debe ser utilizada si instala PHP como CGI binario.

Para mi, Siempre elijo no seguro para subprocesos versión porque siempre uso nginx, o ejecuto PHP desde la línea de comando.


233
2017-11-21 17:34



Apache MPM prefork con modphp se usa porque es fácil de configurar / instalar. En cuanto a rendimiento, es bastante ineficiente. Mi forma preferida de hacer la pila, FastCGI / PHP-FPM. De esa forma puede usar el trabajador MPM mucho más rápido. Todo el PHP sigue sin enhebrar, pero Apache sirve enhebrado (como debería).

Entonces, básicamente, de abajo hacia arriba

Linux

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

PHP-FPM + APC

ModFCGI no admite PHP-FPM correctamente, o cualquier aplicación FastCGI externa. Solo es compatible con scripts FastCGI sin proceso. PHP-FPM es el administrador de procesos PHP FastCGI.


27
2017-07-18 17:55



Según Documentación PHP,

¿Qué significa seguridad de subprocesos al descargar PHP?

La seguridad del subproceso significa que el binario puede funcionar en un servidor web multiproceso   contexto, como Apache 2 en Windows. Thread Safety funciona al crear   una copia de almacenamiento local en cada hilo, para que los datos no colisionen   con otro hilo

Entonces, ¿qué elijo? Si elige ejecutar PHP como un binario CGI, entonces   no necesitará seguridad de subprocesos, porque el binario se invoca en cada   solicitud. Para servidores web multiproceso, como IIS5 e IIS6,   debería usar la versión enhebrada de PHP.

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

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

16
2017-12-14 12:21