如何将POST数据传递给PHP-CGI?

Nat*_*man 7 php post cgi http request

更新:

绝望之下,我在shell中做了以下事情:

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
Run Code Online (Sandbox Code Playgroud)

...并且仍然没有$_POST变量显示在此输出中:

<?php var_dump($_POST); ?>
Run Code Online (Sandbox Code Playgroud)

我正在尝试创建一个与php-cgi二进制文件接口的小型Web服务器.然而,情况并不顺利.该php-cgi二进制正确处理GET请求.当涉及到POST请求$_POST时,即使事情正在进行POST,数组也是空的.

我已经检查了被送入php-cgi二进制文件的HTTP标头,它们确实包含了POST数据和Content-type: application/x-www-form-urlencoded标头.

什么可以阻止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);

?>
Run Code Online (Sandbox Code Playgroud)

......产生了输出:

NULL
Run Code Online (Sandbox Code Playgroud)

......表明在这里工作的东西更奇怪.


我越来越近了...我在/main/php_content_types.c中找到了这个函数:

SAPI_API SAPI_POST_READER_FUNC(php_default_post_reader)

...它似乎是处理POST请求的代码.

Nat*_*man 8

终于明白了:

显然CONTENT_LENGTH需要设置环境变量.

添加:

CONTENT_LENGTH=6
export CONTENT_LENGTH
Run Code Online (Sandbox Code Playgroud)

以上我的例子使它正常工作!