2016-04-21 82 views
0

我正在使用file_get_contents()執行POST到API服務。這適用於大多數查詢。但是,最近我有一個失敗,其中file_get_contents()在內容中返回HTTP標頭!file_get_contents返回內容中的HTTP標頭

的代碼:

$resp = file_get_contents("http://10.72.18.21:8000",false, $context); 
var_dump($resp); 
var_dump($http_response_header); 

我碰到下面的內容和標題每次:

string(114328) "Server: Spark Proxy Server 
Content-Length: 114272 

{"records":....} 
" 
array(1) { 
    [0]=> 
    string(31) "HTTP/1.0 200 Spark Proxy Server" 
} 

注意裏面的$resp你可以看到頭(前兩行),它應該正常在$http_response_header中解析。

我也曾嘗試兩種不同的方法做POST:(一)fopen + while循環和(b)fopen + stream_get_contents。在所有三種情況下,結果都是一樣的。所有這三者之間的共同點是我創建使用該流上下文:

$opts = array('http' => 
array(
    'method' => 'POST', 
    'header' => 'Content-type: application/x-www-form-urlencoded;charset=utf-8', 
    'content' => http_build_query($params) 
    ) 
); 

$context = stream_context_create($opts); 

現在,查詢使用相同的代碼,但與修改一個參數相同的API,一切正常和完整的標題是:

array(3) { 
    [0]=> 
    string(31) "HTTP/1.0 200 Spark Proxy Server" 
    [1]=> 
    string(26) "Server: Spark Proxy Server" 
    [2]=> 
    string(19) "Content-Length: 288" 
} 

最後,我已經嘗試了與python和cUrl失敗相同的調用,並且在這兩種情況下結果都是正確的,所以我非常確定它是與php相關的問題。

問題:

  • 有沒有人見過這種行爲?
  • 有沒有辦法在不使用stream_context_create的情況下執行相同的POST?
  • 它可以與時間有關嗎?失敗的例子花費高達1.4分鐘才能完成
+0

'10.72.18.21'是一個專用網絡地址,請與您的技術支持人員覈對,他們最近沒有在混音中的某個地方添加代理服務器,或者更改了一直存在的代理服務器的配置 – RiggsFolly

+0

@RiggsFolly嗨,實際上,IP是一個(自定義)代理服務器:)過濾我的查詢,並反過來使用真正的API(我無法訪問),reo整理結果並將其發回。然而,我已經測試過捲曲和瀏覽器,它的工作原理...所以我不認爲是一個網絡問題 – urban

回答

0

我已經試過這個今天再次...和,而不是在內容混合頭,我得到空的內容和部分頭。這個錯誤雖然是谷歌很容易,並導致我this SO answer談論類似的問題(奇怪的file_get_contents行爲)。

作爲第一個評論暗示,更改默認套接字超時解決我的問題(它被設置爲60):

ini_set("default_socket_timeout", 600); 

我不太清楚插座怎麼能因爲數據超時和接收頭似乎完整...

相關問題