2011-08-12 26 views
6

Básicamente, estoy tratando de averiguar cómo se puede llamar PHP desde un "servidor web".Llamar a PHP desde el "servidor web" virtual/personalizado

He leído la documentación, pero no sirvió de mucho.

Por lo que yo puedo decir, hay tres maneras de invocar PHP:

  • a través de línea de comandos (por ejemplo: php -f "/path/to/script.php")
  • a través de CGI (??)/vía FastCGI (???)
  • a través de un servidor web (por ejemplo: Apache) módulo

Así que vamos a empezar con CGI. Tal vez estoy solo a ciegas, pero la especificación no menciona cómo en la Tierra el servidor web pasa datos (encabezados & devoluciones de llamada) a la cosa implementando CGI. La situación es aún peor con FastCGI.

A continuación, tenemos módulos específicos del servidor, que, ni siquiera sé qué buscar, ya que todos los clientes potenciales no terminan en ninguna parte.

+1

¿Ha considerado leer el código? Todas estas cosas en tu pregunta son de código abierto. –

+0

@Dan, estoy * intentando * hacer eso ahora mismo. Pero está resultando difícil por varias razones: ** (1) ** No puedo encontrar todo el código ** (2) ** el código está en c/C++ ** (3) ** el código es muy antiguo y/o desordenado – Christian

+0

@Dan dice quién ?? Podría hacerlo en Assembler o ADA si quisiera (o FPC, que estoy planeando). – Christian

Respuesta

7

Invocar una secuencia de comandos CGI es bastante simple. PHP tiene algunas peculiaridades, pero que, básicamente, sólo es necesario configurar una lista de variables de entorno, a continuación, llamar al binario PHP-CGI:

setenv GATEWAY_INTERFACE="CGI/1.1" 
setenv SCRIPT_FILENAME=/path/to/script.php 
setenv QUERY_STRING="id=123&name=title&parm=333" 
setenv REQUEST_METHOD="GET" 
... 

exec /usr/bin/php-cgi 

mayoría de ellos son repetitivo. SCRIPT_FILENAME es cómo pasa el nombre de archivo php real al intérprete PHP, no como parámetro exec. Crucial para PHP es también la variable no estándar REDIRECT_STATUS=200.

Para una solicitud GET solo necesita las variables de entorno. Para una solicitud POST, simplemente canaliza el cuerpo de la solicitud HTTP como stdin al binario php-cgi ejecutado. El stdout devuelto es la respuesta CGI que consiste en un encabezado HTTP incompleto, \ r \ n \ r \ n, y el cuerpo de la página.

(Solo por la memoria. Tal vez haya algunos errores más)

+0

OH. Eso lo explica todo. – Christian

+0

Me enfrenté al problema, entonces debe completar las variables 'PATH_INFO' y' SCRIPT_PATH' explícitamente. Por favor revise [mi pregunta] (http://stackoverflow.com/questions/18962960) para detalles – Andrey

1

FastCGI es probablemente la mejor opción ya que se utiliza con tanta sabiduría, sería darle independencia del lenguaje (que podría caer en Ruby más tarde, por ejemplo) y es well documented con lotsofexamples.

Puedes escribir tu propio Server API si realmente quieres, pero es más complicado que implementar FastCGI y tiene varias desventajas.

No me molestaría en absoluto con CGI directo, FastCGI existe por algún motivo.

+0

OK, ¿cómo hace el servidor web IPC con el ejecutable de PHP? conexión local (loopback)? – Christian

+0

@Christian podría estar en un host diferente (una conexión TCP/IP arbitraria) o en el otro extremo de un conducto unix. Lee las especificaciones a las que me he vinculado, está escrito de manera muy simple. –

+0

Voy a darle un buen vistazo después de unas horas de sueño. Ya son las 2:30 a.m.:/ – Christian

Cuestiones relacionadas