Wie übergebe ich $ _GET-Variablen über die Befehlszeile an ein PHP-Skript?

15

Ich versuche, einen Webserver zu erstellen, der PHP-Skripte bereitstellt. Derzeit funktioniert es wie folgt:

  1. Der Client fordert /index.php?test=value an
  2. Der Server ruft auf php index.php
  3. Der Server leitet die HTTP-Anforderungsheader als STDIN an den PHP-Prozess weiter
  4. Der Server liest die Ausgabe phpvon STDOUT und gibt sie an den Client zurück

All dies funktioniert, außer dass die Parameter nicht an das PHP-Skript übergeben werden, weil:

var_dump($_GET);

kehrt zurück:

Array (0) {}

Wie werden $_GETParameter beim Aufruf an die PHP-Binärdatei übergeben?

Nathan Osman
quelle
Welcher Webserver? Wie haben Sie den Webserver konfiguriert? Wie haben Sie PHP konfiguriert?
Joschi
@jos: Es ist JetHTTP - eines, das ich selbst geschrieben habe.
Nathan Osman

Antworten:

30

Welche PHP-Binärdatei verwenden Sie? Die CLI oder CGI? Ich vermute, Sie benötigen eine CGI-Version der Binärdatei für PHP, um die Umgebungsvariablen und POST-Daten ordnungsgemäß zu akzeptieren, wenn Sie dies bestehen.

Die php-cgiBinärdatei implementiert die CGI-Schnittstelle, mit der Sie Parameter in der Befehlszeile übergeben können:

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

Welche landen in $_GET:

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

Sie können sich über die Funktionsweise von CGI informieren, um dies auf Ihrem Webserver zu implementieren.

Ref: RFC3875

Zoredache
quelle
Yup ... sicher genug. Das war das Problem.
Nathan Osman
4

Laut Wikipedia lautet die Antwort, die QUERY_STRINGUmgebungsvariable zu setzen :

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

oder in separaten Schritten:

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

Dies funktioniert, wenn Sie den php-cgiBefehl verwenden, da dies Teil der CGI-Spezifikation ist. Der normale phpBefehl ignoriert diese Variable, aber Ihr Skript verwendet sie möglicherweise.

Nathan Osman
quelle
1

Wenn Sie PHP script.php Test übergeben = asdf

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

Wenn Sie es an STDIN übergeben, müssen Sie STDIN lesen und die Header selbst analysieren. REQUEST_URI würde die Daten enthalten, die Sie benötigen, und Sie könnten das übergeben.

karmawhore
quelle
Ich brauche die Variablen, um verfügbar zu sein, $_GETwie sie sind, wenn PHP unter Apache verwendet wird.
Nathan Osman
Alles schön und gut, bis jemand besucht/index.php?test=asdf;rm%20-rf%20/
danlefree
@dan: Keine Sorge, mein Webserver ist klug genug, um das zu handhaben.
Nathan Osman