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:
…indicating that something even stranger is at work here.
I’m getting closer… I found this function in /main/php_content_types.c:
…and it seems to be the code that processes POST requests.
I finally figured it out:
CONTENT_LENGTH environment variable needs to be set.
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.