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:
-
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:
to my example above causes it to work properly!
Try checking the $HTTP_RAW_POST_DATA variable.
http://php.net/manual/en/reserved.variables.httprawpostdata.php
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?