Como passar variáveis ​​$ _GET para um script PHP via linha de comando?

14

Estou tentando criar um servidor da web que serve scripts PHP. Atualmente, funciona da seguinte maneira:

  1. O cliente solicita /index.php?test=value
  2. O servidor chama php index.php
  3. O servidor alimenta os cabeçalhos de solicitação HTTP como STDIN no processo PHP
  4. O servidor lê a saída de phpSTDOUT e a retorna ao cliente

Tudo isso está funcionando, exceto que os parâmetros não estão sendo passados ​​para o script PHP porque:

var_dump($_GET);

retorna:

matriz (0) {}

Como os $_GETparâmetros são passados ​​para o binário do PHP quando ele é chamado?

Nathan Osman
fonte
Qual servidor web? Como você configurou o servidor web? Como você configurou o PHP?
Joschi
@jos: É o JetHTTP - um que eu mesmo escrevi.
Nathan Osman

Respostas:

29

Qual binário PHP você está usando? A CLI ou CGI? Eu suspeito que você precisa de uma versão CGI do binário para PHP para lidar adequadamente com aceitar as variáveis ​​de ambiente e dados POST, se você passar isso.

O php-cgibinário implementa a interface CGI, que permite passar parâmetros na linha de comando:

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

Que terminam em $_GET:

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

Você pode ler como o CGI funciona para implementá-lo em seu servidor da web.

Ref: RFC3875

Zoredache
fonte
Sim ... com certeza. Esse foi o problema.
Nathan Osman
3

Segundo a Wikipedia , a resposta é definir a QUERY_STRINGvariável de ambiente:

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

ou em etapas separadas:

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

Isso funciona se você usar o php-cgicomando, porque isso faz parte da especificação CGI. O phpcomando comum ignora essa variável, mas seu script pode usá-la.

Nathan Osman
fonte
1

Se você passar no php script.php test = asdf

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

Se você estiver passando para o STDIN, precisará ler o STDIN e analisar os cabeçalhos. REQUEST_URI conteria os dados de que você precisa e pode ser transmitido.

karmawhore
fonte
Eu preciso que as variáveis ​​estejam disponíveis $_GETcomo estão quando o PHP é usado no Apache.
Nathan Osman
Tudo muito bem até que alguém visitas/index.php?test=asdf;rm%20-rf%20/
danlefree
@dan: Não se preocupe, meu servidor é inteligente o suficiente para lidar com isso.
Nathan Osman