Обновить:
В отчаянии я сделал следующее в оболочке:
REDIRECT_STATUS=true SCRIPT_FILENAME=/var/www/... REQUEST_METHOD=POST GATEWAY_INTERFACE=CGI/1.1 export REDIRECT_STATUS export SCRIPT_FILENAME export REQUEST_METHOD export GATEWAY_INTERFACE echo "test=1" | php-cgi
… и STILL переменные $_POST
не отображаются в результатах этого:
<?php var_dump($_POST); ?>
Я пытаюсь создать небольшой веб-сервер, который взаимодействует с двоичным php-cgi
. Однако все идет не так хорошо. php-cgi
корректно обрабатывает запросы GET. Когда дело доходит до запросов POST, массив $_POST
пуст, даже когда вещи получают POSTED.
Я проверил HTTP-заголовки, которые php-cgi
двоичный файл php-cgi
и они действительно включают данные POST и заголовок Content-type: application/x-www-form-urlencoded
.
Что могло бы php-cgi
двоичный файл php-cgi
видеть, что в запрос включены данные POST?
Я продвигаюсь вперед, я выкопал некоторые вещи из исходного кода PHP :
/sapi/cgi/cgi_main.c :
468: static int sapi_cgi_read_post(char *buffer, uint count_bytes TSRMLS_DC)
(Я не знаю, откуда эта функция вызывается).
Прочитав ответ ниже, я попробовал:
<?php var_dump($HTTP_RAW_POST_DATA); ?>
… которые дали результат:
NULL
… указывая на то, что здесь работает что-то еще странное.
Я приближаюсь … Я нашел эту функцию в /main/php_content_types.c :
SAPI_API SAPI_POST_READER_FUNC (php_default_post_reader)
… и, похоже, это код, который обрабатывает запросы POST.
Я, наконец, понял это:
По-видимому, необходимо установить переменную среды CONTENT_LENGTH
.
Добавление:
CONTENT_LENGTH=6 export CONTENT_LENGTH
к моему примеру выше заставляет его работать правильно!
Вы упомянули, что ваша система отлично работает. длина контента должна быть установлена только для POST
Также это может помочь, это спецификация CGI / 1.1. Он показывает, какие переменные среды должны быть установлены:
http://graphcomp.com/info/specs/cgi11.html и этот lib.ru/WEBMASTER/cgi1_1spec/interface.html
Каковы минимальные переменные среды, необходимые для получения запросов GET?
Попробуйте проверить переменную $ HTTP_RAW_POST_DATA.
http://php.net/manual/en/reserved.variables.httprawpostdata.php