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

时间:2010-10-27 05:12:58

标签: php http post cgi 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

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

<?php var_dump($_POST); ?>

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

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

什么可能让php-cgi二进制文件看不到请求中包含POST数据?


我正在取得进展,我从PHP source code中挖出了一些东西:

  • /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请求的代码。

3 个答案:

答案 0 :(得分:7)

终于想通了:

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

添加:

CONTENT_LENGTH=6
export CONTENT_LENGTH

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

答案 1 :(得分:4)

你提到你的系统确实很好。只需为POST设置内容长度

这也许有帮助,它是CGI / 1.1规范。它显示了需要设置的环境变量:

http://graphcomp.com/info/specs/cgi11.html和此lib.ru/WEBMASTER/cgi1_1spec/interface.html

获取GET请求所需的最小环境变量是什么?

答案 2 :(得分:0)

尝试检查$ HTTP_RAW_POST_DATA变量。

http://php.net/manual/en/reserved.variables.httprawpostdata.php