Update:
In开发者_运维技巧 a fit of desperation, I did the following in a 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
...and STILL no $_POST
variables are showing up in the output of this:
<?php var_dump($_POST); ?>
I am trying to create a small webserver that interfaces with the php-cgi
binary. However, things aren't going so well. The php-cgi
binary correctly handles GET requests. When it comes to POST requests, the $_POST
array is empty, even when things are getting POSTed.
I've checked the HTTP headers being fed into the php-cgi
binary and they do indeed include the POST data and the Content-type: application/x-www-form-urlencoded
header.
What could be keeping the php-cgi
binary from seeing that there's POST data included in the request?
I'm making progress, I've dug up some stuff from the PHP source code:
/sapi/cgi/cgi_main.c:
468: static int sapi_cgi_read_post(char *buffer, uint count_bytes TSRMLS_DC)
(I have no idea where this function is invoked from.)
After reading the answer below, I tried:
<?php
var_dump($HTTP_RAW_POST_DATA);
?>
...which yielded the output:
NULL
...indicating that something even stranger is at work here.
I'm getting closer... I found this function in /main/php_content_types.c:
SAPI_API SAPI_POST_READER_FUNC(php_default_post_reader)
...and it seems to be the code that processes POST requests.
I finally figured it out:
Apparently the CONTENT_LENGTH
environment variable needs to be set.
Adding:
CONTENT_LENGTH=6
export CONTENT_LENGTH
to my example above causes it to work properly!
You mentioned that your system did GETs just fine. content length only needs to be set for POSTs
Also this might help, it's the CGI/1.1 specification. It shows what environment variables need to be set:
http://graphcomp.com/info/specs/cgi11.html and this lib.ru/WEBMASTER/cgi1_1spec/interface.html
What were the minimum environment variables you needed to get GET requests working?
Try checking the $HTTP_RAW_POST_DATA variable.
http://php.net/manual/en/reserved.variables.httprawpostdata.php
精彩评论