Вопрос или проблема
Я пытаюсь создать веб-сервер, который обрабатывает PHP-скрипты. В настоящее время это работает следующим образом:
- Клиент запрашивает /index.php?test=value
- Сервер вызывает
php index.php
- Сервер передает HTTP-заголовки запроса в STDIN процессу PHP
- Сервер читает вывод
php
из STDOUT и возвращает его клиенту
Все это работает, за исключением того, что параметры не передаются в PHP-скрипт, потому что:
var_dump($_GET);
возвращает:
array(0) { }
Как параметры $_GET
передаются в бинарный файл PHP при его вызове?
Какой бинарный файл 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
Согласно Википедии, ответ заключается в том, чтобы установить переменную окружения 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
игнорирует эту переменную, но ваш скрипт может ее использовать.
Если вы передаете php script.php test=asdf
$result = parse_args($argv,$argc,$help);
print_r($result);
Если вы передаете это в STDIN, вам нужно будет читать STDIN и самостоятельно разбирать заголовки. REQUEST_URI будет содержать необходимые данные, и вы могли бы их передать.
Полное, но простое решение для передачи параметров через $_GET
, независимо от того, запрашиваются ли они из CLI любого веб-сервера или из URL:
if (empty($_GET)) {
if (isset($argv))
parse_str(implode('&', $argv), $_GET);
elseif (isset($_SERVER['argv']))
parse_str(implode('&', $_SERVER['argv']), $_GET);
}
Таким образом, оба приведенных ниже запроса дают нам GET-параметр foo
:
http://example.com/test.php?foo=bar
/bin/env php /.../test.php foo=bar
Ответ или решение
Чтобы передать переменные $_GET в PHP-скрипт через командную строку, важно понимать некоторые нюансы работы PHP в различных окружениях, таких как CLI (Command Line Interface) и CGI (Common Gateway Interface). Давайте рассмотрим, как правильно организовать этот процесс.
1. Выбор подходящей версии PHP
Для передачи параметров через командную строку рекомендуется использовать php-cgi
, так как именно этот интерпретатор обрабатывает переменные окружения в соответствии с рекомендациями CGI. Основной интерпретатор php
не учитывает эти переменные, что может привести к тому, что массив $_GET остается пустым.
2. Установка переменной QUERY_STRING
Чтобы PHP смог корректно обработать переменные, вам нужно установить переменную окружения QUERY_STRING
. Это можно сделать следующим образом:
QUERY_STRING='test=value' php-cgi index.php
Либо вы можете сделать это в несколько шагов:
export QUERY_STRING='test=value'
php-cgi index.php
После выполнения этой команды в массиве $_GET будет содержаться значение:
Array
(
[test] => value
)
3. Альтернативные способы передачи параметров
Если вы используете команду php
и хотите передать параметры, можно воспользоваться аргументами командной строки. Например:
php index.php test=value
В этом случае необходимо будет написать код, который извлекает переданные параметры.
Простой способ извлечения аргументов:
if (empty($_GET)) {
if (isset($argv)) {
parse_str(implode('&', array_slice($argv, 1)), $_GET);
} elseif (isset($_SERVER['argv'])) {
parse_str(implode('&', array_slice($_SERVER['argv'], 1)), $_GET);
}
}
Этот код сначала проверяет, пуст ли массив $_GET, и, если это так, извлекает параметры из аргументов командной строки, переданных скрипту.
4. Запуск скрипта
Теперь вы можете запускать ваш скрипт как через веб-сервер, так и через командную строку, и в обоих случаях массив $_GET будет корректно заполнен.
Для вызова через CLI с передачей параметров можете использовать, например:
php your_script.php test=value
Заключение
Корректная передача переменных $_GET в PHP-скрипт через командную строку требует использования либо подходящего интерпретатора, такого как php-cgi
, либо написания дополнительного кода для обработки аргументов командной строки.
Этот метод совместим с разными способами вызова вашего скрипта, что делает его универсальным для использования как в CLI, так и в веб-среде. Не забывайте тестировать ваш скрипт в разных условиях, чтобы убедиться в его надежности.