¿Cómo pasar variables $ _GET a un script PHP a través de la línea de comando?

14

Estoy tratando de crear un servidor web que sirva scripts PHP. Actualmente, funciona de la siguiente manera:

  1. El cliente solicita /index.php?test=value
  2. El servidor invoca php index.php
  3. El servidor alimenta los encabezados de solicitud HTTP como STDIN al proceso PHP
  4. El servidor lee el resultado de phpSTDOUT y lo devuelve al cliente

Todo esto funciona, excepto que los parámetros no se pasan al script PHP porque:

var_dump($_GET);

devoluciones:

matriz (0) {}

¿Cómo $_GETse pasan los parámetros al binario PHP cuando se invoca?

Nathan Osman
fuente
¿Qué servidor web? ¿Cómo ha configurado el servidor web? ¿Cómo has configurado PHP?
joschi
@jos: Es JetHTTP, uno que escribí yo mismo.
Nathan Osman

Respuestas:

29

¿Qué binario PHP estás usando? El CLI o CGI? Sospecho que necesita una versión CGI del binario para que PHP maneje correctamente las variables de entorno y los datos POST si los pasa.

El php-cgibinario implementa la interfaz CGI, que le permite pasar parámetros en la línea de comando:

php-cgi -f index.php left=1058 right=1067 class=A language=English

Que terminan en $_GET:

Array
(
    [left] => 1058
    [right] => 1067
    [class] => A
    [language] => English
)

Es posible que desee leer sobre cómo funciona CGI para que pueda implementar eso en su servidor web.

Ref: RFC3875

Zoredache
fuente
Sí ... efectivamente. Ese fue el problema.
Nathan Osman el
3

Según Wikipedia , la respuesta es establecer la QUERY_STRINGvariable de entorno:

QUERY_STRING='user=foo&pass=bar&left=1234' php-cgi index.php

o en pasos separados:

export QUERY_STRING='user=foo&pass=bar&left=1234'
php-cgi index.php

Esto funciona si usa el php-cgicomando, porque esto es parte de la especificación CGI. El phpcomando ordinario ignora esta variable, pero su script puede usarla.

Nathan Osman
fuente
1

Si pasa php script.php test = asdf

$result = parse_args($argv,$argc,$help);
print_r($result);

Si se lo pasa a STDIN, deberá leer STDIN y analizar los encabezados usted mismo. REQUEST_URI contendría los datos que necesita y puede pasarlos.

karmawhore
fuente
Necesito que las variables estén disponibles $_GETcomo cuando PHP se usa en Apache.
Nathan Osman
Todo bien hasta que alguien nos visita/index.php?test=asdf;rm%20-rf%20/
danlefree
@dan: No te preocupes, mi servidor web es lo suficientemente inteligente como para manejar eso.
Nathan Osman