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

775

Vi diferentes binarios para PHP, como no-thread o thread safe?

¿Qué significa esto?

¿Cuál es la diferencia entre estos paquetes?

O ..
fuente

Respuestas:

669

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 utilizar hilos, es decir, el servidor web creará / dedicará un solo hilo para cada solicitud entrante. El servidor web Apache HTTP admite múltiples modelos para manejar solicitudes, uno de los cuales (llamado el MPM de trabajo) utiliza subprocesos. Pero admite otro modelo de concurrencia llamado prefork MPM que utiliza procesos, es decir, el servidor web creará / dedicará un solo proceso para cada solicitud.

También hay otros modelos de simultaneidad completamente diferentes (utilizando sockets asíncronos y E / S), así como otros que mezclan dos o incluso tres modelos. Para responder a esta pregunta, solo nos interesan los dos modelos anteriores y tomar el servidor Apache HTTP como ejemplo.

Antecedentes necesarios 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 vuelta 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 se compiló como un módulo para el servidor web, por lo que se carga directamente dentro de él.

Hay 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 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 subprocesos), entonces PHP debe poder operar dentro de este mismo entorno de subprocesos múltiples, lo que significa que PHP tiene que ¡Sea seguro para poder jugar correctamente con Apache!

En este punto, debería estar pensando "OK, así que si estoy usando un servidor web multiproceso y voy a incrustar PHP directamente en él, entonces debo usar la versión de PHP segura para subprocesos". Y este sería un pensamiento correcto. Sin embargo, como sucede, la seguridad de subprocesos de PHP está muy disputada . Es un terreno de uso-si-realmente-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 le recomendamos que use el MPM prefork de Apache (que no usa subprocesos y, por lo tanto, la seguridad de 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 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. Estará viendo el uso de FastCGI o algo igual que funciona 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 del hilo 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 mira la versión de línea de comandos de PHP, la seguridad de los hilos no importa.

Finalmente, si la seguridad de subprocesos no importa, entonces, ¿qué versión debe 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 menos defectuosa, ¡o de lo contrario habrían ofrecido la versión segura para subprocesos y no se habrían molestado en darnos la opción!

Amr Mostafa
fuente
2
¿Entonces PHP-FPM no está enhebrado? Eso resuelve el problema, ya que Fast CGI se usa en servidores nginx.
Xeoncross
41
Increíble detalle, he estado programando en PHP durante años y nunca supe esto.
Patrick
1
@Xeoncross: en general, eso es correcto, y en la práctica es una de las mejores razones para administrar procesos PHP fuera de Apache. Repaso este aspecto en mi respuesta.
JM Becker
El único problema aquí es que PHP-FPM no está disponible en Windows. Al menos como una construcción nativa.
Denis V
99
¿La seguridad de subprocesos de PHP todavía está "muy disputada" (en 2015 y la versión 7)?
Altiano Gerung
261

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 comando u otro entorno donde solo se usa un solo 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 varios subprocesos de PHP se ejecutan simultáneamente.

Greg
fuente
1
Greg debería haber respondido: "Se debe usar una versión segura para subprocesos si desea instalar PHP como un módulo de Apache donde el trabajador es el MPM"
wlf
99
Entonces, ¿PHP que viene con xampp en Windows es NTS o TS?
Abudayah
1
¿Qué pasa si usa un servidor web incorporado PHP? ¿Qué variante de PHP usar para un rendimiento óptimo?
Ariod
1
@Dario Creo que eso es solo Windows.
Greg
1
@ChristopherShaw amigo, la respuesta contiene SOLO opinión. No hay una fuente o razón POR QUÉ usar ZTS en combinación con un módulo Apache. No es una respuesta válida. Incluso 217 personas pueden estar equivocadas m8.
Daniel W.
30

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 usar el MPM Worker mucho más rápido. Todo el 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 admite correctamente PHP-FPM ni ninguna aplicación externa FastCGI. Solo admite scripts FastCGI administrados sin procesos. PHP-FPM es el administrador de procesos PHP FastCGI.

JM Becker
fuente
21

Según la documentación de PHP ,

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

Thread Safety significa que el binario puede funcionar en un contexto de servidor web multiproceso, como Apache 2 en Windows. Thread Safety funciona creando una copia de almacenamiento local en cada hilo, para que los datos no choquen 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 los servidores web multiproceso, como IIS5 e IIS6, debe usar la versión roscada de 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)
Somnath Muluk
fuente