Як передати змінні $ _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


Так ... досить впевнено. У цьому і була проблема.
Натан Осман

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 міститиме потрібні вам дані, і ви можете передати їх.


Мені потрібні змінні, щоб вони були доступними $_GETтакими, якими вони є, коли PHP використовується під Apache.
Натан Осман

Все добре і добре, поки хтось не відвідає/index.php?test=asdf;rm%20-rf%20/
danlefree

@dan: Не хвилюйтесь, мій веб-сервер досить розумний, щоб впоратися з цим.
Натан Осман
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.