PHP интерпретатор и суперглобальные - PullRequest
4 голосов
/ 11 апреля 2011

Прежде всего, я студент французского, так что извините за мой плохой английский уровень.

В настоящее время мы разрабатываем веб-сервер (C ++), и я должен разработать исполнение CGI часть, точнее: PHP CGI часть.

Когда пользователь запрашивает страницу .php на нашем сервере, мы запускаем / pipe и вызываем / usr / bin / php переводчик. Например:

$ / usr / bin / php index.php

Теперь мы можем сохранить результат в буфере (сгенерированный HTML-код index.php), и я могу отправить этот контент для клиента. Он работает для простого скрипта без каких-либо переменных.

Однако многие сценарии php используют некоторые суперглобальные переменные, такие как $ _GET и $ _POST. Моя проблема: как я могу дать интерпретатору php этот аргумент?

Пример: как я могу установить эту переменную $ _POST, чтобы сохранить «Hello world» в наш буфер?

<?php

echo $_POST['text'];

?>

Спасибо за ваши будущие ответы.

1018 * приветливо *

Ответы [ 2 ]

4 голосов
/ 11 апреля 2011

CGI-программы ожидают данные POST на stdin. и получить данные в переменной окружения QUERY_STRING.

3 голосов
/ 11 апреля 2011

Вы должны установить некоторые переменные окружения:

  • REQUEST_METHOD=POST, чтобы сообщить PHP, что ему нужно обработать POST-запрос
  • CONTENT_LENGTH=1234, чтобы сообщить PHP, сколько его байтовполучит как необработанные данные POST (в данном случае 1234 байта)
  • HTTP_CONTENT_LENGTH, в основном, как CONTENT_LENGTH.Лучше установите его так, чтобы он лучше работал с различными версиями / конфигурациями PHP.
  • CONTENT_TYPE=application/x-www-form-urlencoded - это заголовок HTTP Content-Type

Вы получите правильные значения для этихпеременные из заголовка HTTP.

Вам также нужен двунаправленный канал к процессу PHP для отправки необработанных данных POST в его STDIN.Я предполагаю, что вы уже получаете вывод скрипта из PHP.

Пока вы обрабатываете обычный запрос браузера, вам не нужно знать больше подробностей.В противном случае, если данные POST приходят непосредственно с вашего сервера, используйте вышеуказанное CONTENT_TYPE и кодируйте URL-адреса переменных:

  • REQUEST_METHOD=POST
  • CONTENT_LENGTH=16
  • HTTP_CONTENT_LENGTH=16
  • CONTENT_TYPE=application/x-www-form-urlencoded

STDIN-данные: test=Hello+world

Для запросов GET вы изменяете REQUEST_METHOD=GET и оставляете другие переменные.В любом случае вы можете передать строку запроса через переменную окружения QUERY_STRING.

...