2010-05-05 28 views
16

Casi he terminado de escribir un servidor web compatible con HTTP/1.0 bajo Java (sin uso comercial como tal, esto es solo por diversión) y básicamente quiero incluir soporte PHP. Me doy cuenta de que esta no es una tarea fácil en absoluto, pero creo que será un buen logro.¿Cómo funciona PHP con Apache?

Así que quiero saber cómo PHP interactúa exactamente con el servidor web Apache (o cualquier otro servidor web realmente), así que puedo aprender de él y escribir mi propio envoltorio PHP. No necesariamente tiene que ser mod_php, no me importa escribir un contenedor FastCGI, que a mi conocimiento también es capaz de ejecutar PHP.

Hubiera pensado que todo lo que PHP necesita es el resultado que va al cliente (para poder interpretar las partes de PHP), la solicitud HTTP completa del cliente (para que pueda extraer variables POST y demás) y la del cliente nombre de host Y luego simplemente toma el código PHP analizado y lo escribe en la secuencia de salida. Probablemente habrá más cosas, pero en esencia así es como habría pensado que funciona.

Según lo que he reunido hasta ahora, apache2handler proporciona una API que PHP utiliza para 'conectarse' a Apache. Supongo que es una idea mirar el código fuente de apache2handler y php5apache2.dll, pero antes de hacerlo pensé que primero lo haría.

Si alguien tiene más información, experiencia o algún tipo de especificación que sea relevante para esto, por favor avíseme.

¡Gracias de antemano!

Respuesta

19

Hay 3 maneras PHP se puede invocar desde Apache:

1) como un módulo - esto implica que une el intérprete php contra una biblioteca de ganchos publicadas por el servidor web

2) CGI - el servidor web inicia una instancia del intérprete para cada solicitud y pasa los parámetros al intérprete vía stdin, la línea de comando y las variables de entorno, stdout se envía al cliente y stderr debe escribirse en el error_log

3) fastCGI - esto elimina la sobrecarga de comenzar un nuevo proceso para cada solicitud - interp reter se ejecuta como daemon

CGI es el más simple de implementar, pero no escala/funciona bien, el módulo sería el más difícil con diferencia. FastCGI es casi tan rápido como el enfoque de módulo. CGI y fastCGI son API abiertas y bien documentadas.

Existen otras maneras de lograr su objetivo, p. Ej. Quercus

C.

+0

Ajá, esto tiene mucho sentido. ¡Gracias! Voy a ver esto. Tal vez intente hacer que el enfoque CGI funcione y luego mirar en FastCGI cuando miré sus especificaciones el otro día, pero me pareció muy confuso, tal vez estaba buscando en el lugar equivocado. –

4

En pocas palabras, esto es como funciona:

Apache normalmente sirve archivos por ir a buscar el archivo y enviar la corriente abajo de la conexión HTTP. Sin embargo, con PHP, Apache busca el archivo, lo canaliza al binario de PHP y envía la secuencia de salida desde el comando hasta la conexión HTTP.

+0

Este es un buen comienzo, pero la interfaz es más complejo que eso. No olvides que PHP tiene habilidades como modificar los encabezados HTTP antes de que Apache envíe el contenido. – Matt

+0

Esto es exactamente lo que tenía en mente en un nivel muy simple, pero estoy de acuerdo con Matt. PHP hace más que eso. En este momento tengo una clase de analizador que puede analizar la salida del cliente y los encabezados justo antes de su envío (en este momento simplemente devuelve la salida y los encabezados sin modificaciones). E idealmente quiero integrar PHP en este punto. –

1

Además del archivo php, la solicitud HTTP y el nombre de host del cliente, existen ciertos otros elementos de información que normalmente se pasan a PHP para establecer ciertos otros elementos del superglobal $_SERVER. La página de documentación vinculada tiene una lista de lo que típicamente se establece.

+0

Sí, soy consciente de eso, de hecho, es probable que toda la información esté en la sección 'Apache Environment' de phpinfo(). –

+0

Hmm, me acabo de dar cuenta de que $ _SERVER tiene una variable argv y argc que contiene los argumentos pasados ​​al intérprete. Creo que ejecutaré un simple script PHP y sacaré los contenidos argv y argc, esto probablemente me dará una mejor idea de cómo se invoca PHP. Deseche eso: salida en blanco: Apache no se pone en contacto de forma externa con php.exe, debe haber más problemas internos que simplemente consultar php.exe. –

1

La palabra clave es CGI.
Es un protocolo dramáticamente simple, que sirve servidores web por edades.
No es la única forma en que PHP puede interactuar con un servidor web, pero es más común y fácil de implementar.

En resumen, su servidor debe configurar algunas variables de entorno, y luego llamar a un script cgi que es solo un script php.