2010-01-10 20 views
13

Se supone que la función pcntl_fork de PHP bifurca un proceso al igual que la función de horquilla estándar en C.
Pero me preguntaba si esta función realmente bifurca el proceso o si emula ese comportamiento de una manera diferente.
Si realmente se realiza el proceso, está claro qué proceso es: uno de los procesos hijo de Apache.
Eso está bien siempre que Apache esté utilizando el MPM prefork (es decir, un proceso por solicitud).
¿Pero qué sucede si Apache está utilizando el MPM de trabajador?
Cuando se utiliza el MPM worker, cada proceso secundario de Apache contiene muchos subprocesos, cada uno maneja una solicitud HTTP diferente. Entonces, si se bifurca el proceso en esa situación, ni siquiera puedo pensar qué sucedería con todos esos hilos y solicitudes atendidas.
Así que si pcntl_fork() realmente bifurca el proceso, entonces creo que no es una buena idea usar esta función si configura Apache para usar el MPM worker.PHP: ¿Qué hace pcntl_fork() realmente?

¿Qué dicen los expertos? ¿Estoy razonando bien, o simplemente estoy diciendo tonterías?

+0

materiales relacionados se pueden encontrar en el capítulo sobre el Control de Procesos en http://www.tuxradar.com/practicalphp/16/1/0 – Gordon

+0

eche un vistazo a http: // stackoverflow.com/questions/12214785/how-to-use-pcntl-fork-with-apache – yegor256

Respuesta

21

pcntl_fork probablemente funciona como usted piensa que sería: se bifurca el proceso actual, la misma forma en que el tenedor función C hace:

La función pcntl_fork() crea un proceso secundario que difiere del proceso primario solo en su PID y PPID.
Consulte la página de manual de su sistema fork(2) para detalles específicos de sobre cómo funciona la horquilla en su sistema .


Pero, citando la sección Introduction of the Process Control del manual: soporte de Control de

Proceso en PHP implementa el estilo Unix de creación de procesos , la ejecución del programa, la señal manejo y la terminación del proceso.
Control del proceso no debe ser habilitado dentro de un entorno de servidor Web y resultados inesperados puede suceder si se usa cualquier control de procesos funciones dentro de un entorno de servidor Web .

Por lo tanto, no se debe utilizar realmente esa función desde un script PHP se ejecuta a través de Apache: sólo se debe utilizar cuando el script PHP se ejecuta desde la línea de comandos.


Y, antes de comenzar a utilizar esta función, no se olvide que:

Nota: Esta extensión no está disponible en plataformas Windows.

+3

"El control de procesos no debe habilitarse en un entorno de servidor web" => ¡Recuerde siempre leer las presentaciones! – GetFree

+5

Una vida no sería suficiente para leer todo el manual ;-( –

+0

@PascalMARTIN,? ¿Qué significa ese comentario? – Pacerier

3

No es una buena idea ejecutar PHP como un módulo en una instalación de Apache configurada para MPM de trabajador en primer lugar, porque PHP no es seguro (creo que también se indica en el manual de PHP).

Debería bifurcar el proceso, sí. El PHP manual incluso dice que debe leer man fork(2) para obtener más instrucciones, por lo que probablemente sea solo un envoltorio alrededor de la función de la horquilla C.

actualización: Aquí está la página correspondiente en el manual de PHP para el trabajador MPM: http://php.net/install.unix.apache2.php

Nota: Para construir una versión multiproceso de Apache, el sistema de destino debe ser compatible con las discusiones. En este caso, PHP también debería construirse con Zend Thread Safety (ZTS) experimental. Con esta configuración, no todas las extensiones estarán disponibles. La configuración recomendada es construir Apache con el prefork MPM-Module predeterminado.

También encontré esta página con algunas instrucciones adicionales: http://www.stevekallestad.com/blog/apache_worker_mpm_with_php.html

+0

Esto. Solo tenedor cli PHP. – Evert

0

Acabo de utilizar pcntl_fork a través de apache, la extraña situación es que después de fork un proceso secundario, el padre da el resultado estándar (navegador) a su hijo. Entonces, puede crear una imagen, el navegador no puede recibir el resultado del proceso principal.

+1

Lea la respuesta aceptada y, en particular, mi comentario a esa respuesta. – GetFree

+0

Gracias por su publicación :) – bourneli

3

Voy a tratar de ser rápido y conciso,

El uso de "tenedor" a través de Apache es posible, tiene que "instalar" y luego activar las funciones en el php.ini, finalmente, es necesario agregar el extensión en el Apache Directori (un enlace simbólico habría hecho el trabajo también) Ex:

echo "extension=pcntl.so" > /etc/php5/conf.d/pcntl.ini 
ln -s /etc/php5/apache2/conf.d/pcntl.ini /etc/php5/mods-available/pcntl.ini 

por otro lado, he estado usando bifurcan para una gran cantidad de proyectos y es realmente grande en la optimización de la mayoría de ellos, sin embargo, hay un error al abusar de él con apache, básicamente estoy bifurcando al niño bifurcado y haciendo cualquier tipo de cosas hardcore y funciona ... bastante bien, pero bajo carga funciona durante un tiempo antes de comenzar a crear un proceso zombie, puedo administrar el proceso zombie usando "pcntl_signal (SIGCHLD, SIG_IGN);" que básicamente eliminará el proceso tan pronto como el niño termine su tarea, esta ayuda un poco, entonces es cuando Apache enloquece, y comienza a enhebrarse y finalmente bloquea su servidor, no puedo explicar este comportamiento (aún, pero lo haré) este vertedero/árbol malvado creado por apache solo se puede ver desde "ps" ni desde server-status o apache logs, y dije evil tree porque básicamente crea cientos de procesos con hijos de niños ...

in nutshell :

Tenedor con apache funcionará? SÍ ... absolutamente

simplemente no abuso de ella

esperanza que esto ayudará a alguien

Cuestiones relacionadas