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

Вопрос или проблема

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

  1. Клиент запрашивает /index.php?test=value
  2. Сервер вызывает php index.php
  3. Сервер передает HTTP-заголовки запроса в STDIN процессу PHP
  4. Сервер читает вывод 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, так и в веб-среде. Не забывайте тестировать ваш скрипт в разных условиях, чтобы убедиться в его надежности.

Оцените материал
Добавить комментарий

Капча загружается...