que php5 linea comandos cli php concurrency fastcgi

php5 - que es php cli



PHP ejecutándose como una aplicación FastCGI(php-cgi): ¿cómo emitir solicitudes simultáneas? (3)

EDITAR: Actualizar - desplácese hacia abajo
EDIT 2: Actualización - problema resuelto

Alguna información de fondo:

Estoy escribiendo mi propio servidor web en Java y hace un par de días pregunté en SO cómo exactamente Apache interactúa con PHP, así que puedo implementar el soporte de PHP. Aprendí que FastCGI es el mejor enfoque (ya que mod_php no es una opción). Así que he examinado la especificación del protocolo FastCGI y he logrado escribir un contenedor FastCGI que funciona para mi servidor. He probado phpinfo () y funciona, de hecho, todas las funciones de PHP parecen funcionar bien (publicar datos, sesiones, fecha / hora, etc.).

Mi servidor web puede atender solicitudes simultáneamente (es decir, user1 puede recuperar file1.html al mismo tiempo que user2 solicitando some_large_binary_file.zip), lo hace generando un nuevo hilo Java para cada solicitud de usuario (finalizando cuando se complete o conexión de usuario con el cliente) está cancelado).

Sin embargo, no puede tratar con 2 (o más) solicitudes FastCGI al mismo tiempo. Lo que hace es ponerlos en cola, de modo que cuando la solicitud 1 se completa inmediatamente después, comienza a procesar la solicitud 2. Probé esto con 2 páginas PHP, una contiene sleep (10) y la otra phpinfo ().

¿Cómo voy a tratar con múltiples solicitudes, ya que sé que se puede hacer (PHP bajo IIS se ejecuta como FastCGI y puede tratar con múltiples solicitudes muy bien).

Algo más de información:

Estoy codificando en Windows y mi archivo por lotes utilizado para ejecutar php-cgi.exe contiene:

set PHP_FCGI_CHILDREN=8 set PHP_FCGI_MAX_REQUESTS=500 php-cgi.exe -b 9000

Pero no engendra 8 hijos, el servicio simplemente finaliza después de 500 solicitudes.

He hecho investigación y desde Wikipedia :

El procesamiento simultáneo de múltiples solicitudes se logra mediante el uso de una única conexión con multiplexación interna (es decir, múltiples solicitudes en una sola conexión) y / o mediante el uso de múltiples conexiones.

Ahora, claramente, las conexiones múltiples no me funcionan, ya que cada vez que un cliente solicita algo que involucra FastCGI, crea un nuevo socket para la aplicación FastCGI, pero no funciona al mismo tiempo (en su lugar, las pone en cola).

Sé que la multiplexación interna de solicitudes FastCGI bajo la misma conexión se logra al emitir cada solicitud FastCGI única con una ID de solicitud diferente. (también vea los últimos 3 párrafos del encabezado ''El protocolo de comunicación'' en este artículo ).

No lo he probado, pero ¿cómo voy a implementarlo? Lo tomo Necesito algún tipo de subproceso de FastCGI Java que contiene un Mapa de algún tipo y una función estática que puedo usar para agregar solicitudes. Luego, en la función run () de Thread tendría un ciclo while y para cada ciclo verificaría si el mapa contiene nuevas solicitudes, de ser así, les asignaría una ID de solicitud y las escribiría en la transmisión FastCGI. Y luego espere la entrada, etc., etc. Como puede ver, esto se vuelve demasiado complicado.

¿Alguien sabe la forma correcta de hacer esto? O cualquier pensamiento en absoluto? Muchas gracias.

Tenga en cuenta que, si es necesario, puedo suministrar el código para mi contenedor FastCGI.

Actualización :

Básicamente, descargué nginx y lo configuré para usar PHP como una aplicación FastCGI y también sufrió el mismo problema que mi servidor. No podría manejar solicitudes concurrentes de PHP. Esto me lleva a creer que mi código es, de hecho, correcto. Entonces algo anda mal con PHP o no lo estoy configurando correctamente. Tal vez sea porque estoy usando Windows porque algunos usuarios de lighttpd afirman que Windows no puede manejar FastCGI correctamente (esto no tiene mucho sentido). Instalaré Linux algún día pronto e informaré cualquier progreso con eso.


De acuerdo, logré encontrar la causa del problema. No era mi código en absoluto. Es PHP, no puede generar php-cgi adicionales en Windows cuando se ejecuta como modo FastCGI, en Linux funciona perfectamente, simplemente apunté mi servidor a mi IP de Linux Box y no tuve problemas con las solicitudes de FCGI concurrentes. Apesta, pero supongo que así es ...

Miré más profundamente en el código fuente de PHP después de eso y encontré que la sección de código que responde a PHP_FCGI_CHILDREN ha sido encapsulada por #ifndef WIN32 Entonces los desarrolladores deben ser conscientes del problema


Hola, esto llega un poco tarde, he escrito un generador para php-cgi.exe en Windows, no perfecto, pero podría ser lo que necesitabas. Compruébalo aquí .


re: secuencia de comandos spawn-php python ...

Gracias @nosam que realmente ayudó.
Para aquellos que quieran hacerlo funcionar rápidamente, necesitarás lo siguiente (si es un sistema de 64 bits)

ActivePython-2.7.2.5-win64-x64.msi
pywin32-217.win-amd64-py2.7.exe

ActivePython no tiene versiones anteriores de estos en su www, por lo que tendrá que hacer un poco de búsqueda en Google para encontrar un espejo que funcione (hay muchos por ahí)

Una vez que hayas descargado el src de Bitbucket, es posible que necesites editar spawn-php.py (para arreglar el espaciado de las pestañas), ya que bit-bucket parece arruinar las pestañas en el archivo impidiendo que se ejecute.

All-in-all que salvó mi día para un pequeño y ocupado sitio web de Windows usando nginx + fast-cgi.

¡Gracias amigo!