Jak przekazać zmienne $ _GET do skryptu PHP za pomocą wiersza poleceń?

14

Próbuję utworzyć serwer WWW, który obsługuje skrypty PHP. Obecnie działa w następujący sposób:

  1. Klient żąda /index.php?test=value
  2. Serwer się wywołuje php index.php
  3. Serwer podaje nagłówki żądań HTTP jako STDIN do procesu PHP
  4. Serwer odczytuje dane wyjściowe phpz STDOUT i zwraca je klientowi

Wszystko to działa, z wyjątkiem tego, że parametry nie są przekazywane do skryptu PHP, ponieważ:

var_dump($_GET);

zwroty:

tablica (0) {}

W jaki sposób $_GETparametry są przekazywane do pliku binarnego PHP po jego wywołaniu?

Nathan Osman
źródło
Który serwer WWW? Jak skonfigurowałeś serwer WWW? Jak skonfigurowałeś PHP?
joschi,
@jos: To JetHTTP - taki, który sam napisałem.
Nathan Osman

Odpowiedzi:

29

Z którego pliku binarnego PHP korzystasz? CLI czy CGI? Podejrzewam, że potrzebujesz wersji binarnej CGI dla PHP, aby poprawnie obsłużyć akceptuj zmienne środowiskowe i dane POST, jeśli je przekażesz.

Plik php-cgibinarny implementuje interfejs CGI, który umożliwia przekazywanie parametrów w wierszu poleceń:

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

Które kończą się w $_GET:

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

Możesz przeczytać o tym, jak działa CGI, aby zaimplementować to na serwerze WWW.

Ref: RFC3875

Zoredache
źródło
Tak ... na pewno. To był problem.
Nathan Osman,
3

Według Wikipedii odpowiedzią jest ustawienie QUERY_STRINGzmiennej środowiskowej:

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

lub w osobnych krokach:

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

Działa to, jeśli użyjesz php-cgipolecenia, ponieważ jest to część specyfikacji CGI. Zwykłe phppolecenie ignoruje tę zmienną, ale skrypt może jej użyć.

Nathan Osman
źródło
1

Jeśli zdasz test php script.php = asdf

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

Jeśli przekazujesz go do STDIN, musisz przeczytać STDIN i sam parsować nagłówki. REQUEST_URI będzie zawierać potrzebne dane, które możesz przekazać.

karmawhore
źródło
Potrzebuję, aby zmienne były dostępne, $_GETtak jak są, gdy PHP jest używane pod Apache.
Nathan Osman
Wszystko dobrze i dobrze, dopóki ktoś nie odwiedzi/index.php?test=asdf;rm%20-rf%20/
danlefree
@dan: Nie martw się, mój serwer jest wystarczająco inteligentny, aby sobie z tym poradzić.
Nathan Osman