EDIT: Actualización - desplazarse hacia abajo
EDIT 2: Actualización - problema resuelto PHP ejecutándose como una aplicación FastCGI (php-cgi) - ¿cómo emitir solicitudes simultáneas?
Algunos antecedentes:
estoy escribiendo mi propio servidor web en Java y un par Hace unos días pregunté por 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 concurrentemente (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 (que termina cuando se completa o la conexión del usuario con el cliente se cancela).
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, como sé que se puede hacer (PHP en IIS se ejecuta como FastCGI y puede tratar con múltiples solicitudes muy bien).
algo más de información:
estoy codificante bajo las ventanas 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 desovan 8 niños, el servicio simplemente termina después de 500 solicitudes.
I han realizado investigaciones y de Wikipedia: (. Es decir, múltiples solicitudes a través de una única conexión)
procesamiento de múltiples solicitudes simultáneamente se consigue ya sea por utilizando una sola conexión con multiplexación interna y/o al utilizar múltiples conexiones
Ahora, claramente, las conexiones múltiples no me funcionan, ya que cada vez que un cliente solicita sts algo que involucra FastCGI crea un nuevo socket para la aplicación FastCGI, pero no funciona al mismo tiempo (los 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 un request ID diferente. (vea también los últimos 3 párrafos del encabezado 'El protocolo de comunicación' en this article).
No he probado esto, pero ¿cómo podrí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.
Nota, si es necesario, puedo suministrar el código para mi envoltorio FastCGI.
actualización:
Básicamente, he descargado nginx y configurarlo para usar PHP como una aplicación FastCGI y que también sufrieron 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.
Muy bien, me quedé con este problema por un día, y difícil de entender lo que sucede en el sueño() de PHP afectará a otro proceso, gracias por su respuesta y compartir. – ykc