2010-10-27 61 views
5

更新:如何將POST數據傳遞給PHP-CGI?

在一陣絕望的,我沒有在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); ?> 

我試圖創建一個小的Web服務器,與接口二進制。然而,事情並不怎麼樣。 php-cgi二進制文件正確處理GET請求。當涉及POST請求時,即使事情正在發佈,$_POST數組也是空的。

我檢查HTTP頭被送入php-cgi二進制,他們確實也包括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請求。

+0

選擇PHP源代碼的時間:P – 2010-10-27 05:17:45

+1

我沒有答案,但POST數據應該通過stdin進入。 – 2010-10-27 05:18:01

+0

您的Web服務器是否正確實施了CGI 1.1規範? – joschi 2010-10-27 06:22:18

回答

4

終於想通了:

顯然,CONTENT_LENGTH環境變量需要進行設置。

添加:

以上
CONTENT_LENGTH=6 
export CONTENT_LENGTH 

到我的例子使其正常工作!

+0

處瞭解更多關於差異的內容你也應該至少設置Content-type - 基本上,所有你試圖管道的HTTP東西到以前版本的shell腳本中的stdin需要在CGI啓動之前設置爲環境變量。 哦,你應該把這個答案標記爲「接受」:) – TML 2010-10-27 22:31:30

+0

@TML:真的 - 我已經添加了「內容類型」,現在它工作。直到我發佈後24小時,我才接受這個。 (IIRC) – 2010-10-28 05:20:24

0

嘗試檢查$ HTTP_RAW_POST_DATA變量。

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

+0

這是'NULL'。爲什麼這樣做? – 2010-10-27 05:59:37

+0

由於$ HTTP_RAW_POST_DATA是一個糟糕的解決方案 - file_get_contents('php:// input')更好,但不適用於多部分/表單數據編碼的數據。 – TML 2010-10-27 07:06:55

+0

在http://us3.php.net/manual/en/wrappers.php.php – TML 2010-10-27 07:16:13

2

你提到你的系統確實很好。內容長度只需要爲POST設置

這也許有幫助,這是CGI/1.1規範。這表明環境變量需要什麼來進行設置:

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

什麼是你需要得到GET請求工作的最低環境變量?

+0

SCRIPT_FILENAME,REQUEST_METHOD和REDIRECT_STATUS。 – 2011-01-07 17:50:45

+0

如果您的php.ini中有cgi.force_redirect = 0,則不需要REDIRECT_STATUS。我試着添加它和SCRIPT_FILENAME,它仍然不會工作 – 2011-01-07 18:37:45