Как передать переменные $ _GET в скрипт PHP через командную строку?

14

Я пытаюсь создать веб-сервер, который обслуживает сценарии PHP. В настоящее время он работает следующим образом:

  1. Клиент запрашивает /index.php?test=value
  2. Сервер вызывает php index.php
  3. Сервер передает заголовки HTTP-запроса как STDIN процессу PHP
  4. Сервер читает вывод phpиз STDOUT и возвращает его клиенту

Все это работает, за исключением того, что параметры не передаются в скрипт PHP, потому что:

var_dump($_GET);

возвращает:

массив (0) {}

Как $_GETпараметры передаются в двоичный файл PHP, когда он вызывается?

Натан Осман
источник
Какой веб-сервер? Как вы настроили веб-сервер? Как вы настроили PHP?
Йоси
@jos: это JetHTTP - тот, который я написал сам.
Натан Осман

Ответы:

29

Какой бинарный PHP вы используете? CLI или CGI? Я подозреваю, что вам нужна CGI-версия двоичного кода для PHP, чтобы правильно обрабатывать переменные среды и данные POST, если вы передадите это.

В php-cgiбинарном реализует интерфейс CGI, который позволяет передавать параметры в командной строке:

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

Которые в конечном итоге в $_GET:

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

Вы можете прочитать о том, как работает CGI, чтобы реализовать это на своем веб-сервере.

Ссылка: RFC3875

Zoredache
источник
Да ... конечно же. Это была проблема.
Натан Осман
3

Согласно Википедии , ответ - установить QUERY_STRINGпеременную окружения:

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

или в отдельных шагах:

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

Это работает, если вы используете php-cgiкоманду, потому что это является частью спецификации CGI. Обычная phpкоманда игнорирует эту переменную, но ваш скрипт может использовать ее.

Натан Осман
источник
1

Если вы пройдете php script.php test = asdf

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

Если вы передаете его в STDIN, вам нужно прочитать STDIN и разобрать заголовки самостоятельно. REQUEST_URI будет содержать данные, которые вам нужны, и вы можете передать их.

karmawhore
источник
Мне нужно, чтобы переменные были доступны, $_GETкак они есть, когда PHP используется под Apache.
Натан Осман
Все хорошо, пока кто-то не посещает/index.php?test=asdf;rm%20-rf%20/
danlefree
@dan: Не волнуйтесь, мой веб-сервер достаточно умен, чтобы справиться с этим.
Натан Осман