2011-08-18 146 views
1

我想從PHP腳本發佈一些數據(一個JSON字符串)到一個Java服務器(全部由我自己寫的)並得到響應回來。 我嘗試下面的代碼:在PHP緩慢的HTTP POST請求

$url="http://localhost:8000/hashmap"; 
$opts = array('http' => array('method' => 'POST', 'content' => $JSONDATA,'header'=>"Content-Type: application/x-www-form-urlencoded")); 
$st = stream_context_create($opts); 
echo file_get_contents($url, false,$st); 

現在,這個代碼實際工作(我回來的結果是正確的答案),但的file_get_contents掛起每次20秒執行(我之前打印的時間和指令後)。服務器執行的操作只需要很少的時間,我相信等待所有這些時間來獲得響應是不正常的。 我錯過了什麼嗎?

+1

爲什麼你不使用curl? –

+0

tbh我不能看到或知道任何有助於這一切的東西,在代碼中似乎都是正常的,但是,一個建議是,爲什麼不把所有的代碼放在一個函數中,然後在需要時調用該函數。 – RSM

+0

@Daniel A. White:我知道,但我想避免使用這個項目的擴展名,它應該獨立於其他庫。 – breathe0

回答

0

嘗試增加Connection: closeContent-Length: strlen($JSONDATA)頭到$opts。另外,如果您想避免使用擴展名,請查看this class,我前一段時間寫過使用PHP核心執行HTTP請求。它適用於PHP4(這就是我寫它的原因)和PHP5,它所需要的唯一擴展是OpenSSL,並且只有在需要執行HTTPS請求時才需要。在頂部的評論中記錄(ish)。

支持各種東西 - GET,POST,PUT等,包括文件上傳,cookies,自動重定向處理。我在一個經常使用PHP的平臺上使用它很多,它堅持使用PHP/4.3.10,並且它運行的非常漂亮...即使我自己這樣說...

+0

工作就像一個魅力。非常感謝!請,你能解釋爲什麼它必須完成嗎? – breathe0

+1

'Content-Length'告訴服務器你要發送多少數據 - 如果你沒有包含它,服務器不知道你已經完成數據發送,並且不會處理響應,直到服務器上的定時器機制過期 - 這取決於服務器多長時間。 'Connection:close'告訴服務器在完成這個請求後立即刪除TCP連接,因爲HTTP/1.1在單個TCP會話上支持多個請求。如果您感興趣,請閱讀RFC(http://www.w3.org/Protocols/HTTP/1.1/draft-ietf-http-v11-spec-01.html#Keep-Alive)。 – DaveRandom

+0

我在編輯之前編寫了previuos註釋,並且詢問關於連接的信息:close(即使沒有strlen($ jsondata)也可以工作)。我看到你的班級,很酷的隊友!謝謝,我會用它 – breathe0

1

嚴重錯誤配置的服務器可能不會發送正確的內容大小和使用HTTP/1.1。

請修復服務器或請求該數據作爲HTTP/1.0

+0

內容大小是否正確。我使用httpserver sun api,並檢查了內容的大小。嘗試1.0和1.1,但它不影響行爲。不管怎麼說,還是要謝謝你! – breathe0