2009-02-26 22 views
6

Recientemente leí acerca de http://php.net/pcntl y me preocupaba lo bien que funcionaban las funciones y si sería inteligente usar multihilo en PHP ya que no es una función central de PHP.Multithreading en PHP

Me gustaría desencadenar eventos que no requieren comentarios a través de él, como disparar una ejecución cronjob manualmente.

Todo ello se supone para funcionar en una aplicación web escrita con Zend Framework

Respuesta

7

El paquete PCNTL funciona bastante bien - sólo se utiliza el unix functions acuerdo. La única escasez es que no puede usarlos si se invoca php desde un contexto de servidor web. es decir, puede usarlo en scripts de shell, pero no en páginas web, al menos no sin utilizar un hack como calling a forking script with exec o similar.

[editar] Acabo de encontrar una página que explica why mod_php cannot fork. Básicamente es un problema de seguridad. [/ edit]

+0

maldita sea que quería usarlo en una aplicación web :( – Thomaschaaf

2

La única forma posible de ejecutar código php en múltiples hilos es ejecutar php como un módulo de un servidor web con hilos, lo cual es inútil porque los hilos están completamente aislados y su código no tiene control sobre ellos . Por lo que sé, pcntl solo administra procesos, no hilos.

4

Esto no es control de hilo, esto es control de proceso. La biblioteca para los hilos es pthreads (POSIX threads) y no está incluida en PHP, por lo que no hay funciones multihilo en PHP.

En multiprocesamiento, no se puede usar eso en mod_php, ya que sería un agujero de seguridad gigante (el proceso generado tendría todos los privilegios del servidor web).

2

Si tuviera que hacer ejecuciones manuales de crontab o similares desde PHP, probablemente usaría una cola. Tenga una tabla de base de datos a la que anexe trabajos. Otro proceso, ya sea desde un cron o ejecutándose como daemon, ejecuta los trabajos a medida que aparecen.

Otra forma de hacerlo es configurar una secuencia de comandos separada y hacer un HTTP GET a la misma. No está pasando de rosca, pero es una forma de disparar a otro comando en PHP.

Por ejemplo, si quería correr /usr/bin/somescript.sh en la demanda, tendría un somescript.php que hizo una llamada al sistema. Esto sería en un host virtual solo accesible desde localhost.

Haría una llamada de socket al servidor web y OBTUVE el script. La clave es no leer en el zócalo para que no se bloquee. Si quería verificar el valor de retorno de somescript.php, lo haría más tarde en mi script principal para evitar el bloqueo.

Si somescript.php tarda mucho tiempo en ejecutarse (más larga que la secuencia de comandos que llama), se tendrá que hacer un poco de magia para detener Apache de matar al script cuando se cierra el socket.

1

ejemplos de múltiples hilos de trabajo en PHP (con extractos de sus páginas de proyectos):

Como del 25 de octubre del 2011, este módulo ha llegado a "final de la vida" y está en desuso en favor de proyectos como Elysia Cron. Este módulo no era completamente inútil ya que un parche central inspirado en Cron MT estaba comprometido con D7.

... proporciona almacenamiento en caché de la página estática para Drupal que permite un rendimiento y escalabilidad impulso muy significativo para los sitios que reciben tráfico mayoría anónimos. Para el alojamiento compartido, esta es su mejor opción en términos de mejorar el rendimiento. En servidores dedicados, es posible que desee considerar Varnish en su lugar.