Comment passer des variables $ _GET à un script PHP via la ligne de commande?

14

J'essaie de créer un serveur Web qui sert des scripts PHP. Actuellement, cela fonctionne comme suit:

  1. Le client demande /index.php?test=value
  2. Le serveur invoque php index.php
  3. Le serveur alimente les en-têtes de requête HTTP en STDIN vers le processus PHP
  4. Le serveur lit la sortie de phpSTDOUT et la renvoie au client

Tout cela fonctionne, sauf que les paramètres ne sont pas transmis au script PHP car:

var_dump($_GET);

Retour:

tableau (0) {}

Comment les $_GETparamètres sont-ils transmis au binaire PHP lorsqu'il est invoqué?

Nathan Osman
la source
Quel serveur web? Comment avez-vous configuré le serveur Web? Comment avez-vous configuré PHP?
joschi du
@jos: C'est JetHTTP - celui que j'ai écrit moi-même.
Nathan Osman

Réponses:

29

Quel binaire PHP utilisez-vous? La CLI ou CGI? Je soupçonne que vous avez besoin d'une version CGI du binaire pour PHP pour gérer correctement accepter les variables d'environnement et les données POST si vous passez cela.

Le php-cgibinaire implémente l'interface CGI, qui vous permet de passer des paramètres sur la ligne de commande:

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

Qui finissent par $_GET:

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

Vous voudrez peut-être en savoir plus sur le fonctionnement de CGI afin de pouvoir l'implémenter dans votre serveur Web.

Réf: RFC3875

Zoredache
la source
Ouais ... bien sûr. C'était ça le problème.
Nathan Osman
3

Selon Wikipedia , la réponse est de définir la QUERY_STRINGvariable d'environnement:

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

ou en plusieurs étapes:

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

Cela fonctionne si vous utilisez la php-cgicommande, car elle fait partie de la spécification CGI. La phpcommande ordinaire ignore cette variable, mais votre script peut l'utiliser.

Nathan Osman
la source
1

Si vous passez php script.php test = asdf

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

Si vous le transmettez à STDIN, vous devrez lire STDIN et analyser les en-têtes vous-même. REQUEST_URI contiendrait les données dont vous avez besoin, et vous pourriez les transmettre.

karmawhore
la source
J'ai besoin que les variables soient disponibles $_GETcomme elles le sont lorsque PHP est utilisé sous Apache.
Nathan Osman
Tout va bien jusqu'à ce que quelqu'un visite/index.php?test=asdf;rm%20-rf%20/
danlefree
@dan: Ne vous inquiétez pas, mon serveur Web est suffisamment intelligent pour gérer cela.
Nathan Osman du