2014-07-16 110 views
0

我在我的公司網站之一中測試了303重定向的用例,我注意到兩個不同情況之間的巨大延遲,一個執行正常,另一個持續10秒,我意識到那是我設置的超時(使用CURLOPT_TIMEOUT標誌)。PHP cURL在重定向超時

該測試旨在嘗試重定向後POST查詢轉換爲GET查詢的情況。

我用301和302重定向測試了它,結果也一樣。最後,在解決了這個問題之後,我找到了解決方案,我認爲分享會很有趣。

重定向頁面

<?php 

header("HTTP/1.1 303 See Other");  
header("Location: http://127.0.0.1/test-303-redirection-2.html"); 

捲曲示例腳本

<?php 

$ch = curl_init(); 

curl_setopt($ch, CURLOPT_URL, "http://127.0.0.1/test-303-redirection-1.php"); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); 
curl_setopt($ch, CURLOPT_TIMEOUT, 10); 
curl_setopt($ch, CURLOPT_VERBOSE, TRUE); 
curl_setopt($ch, CURLOPT_HEADER, true); 
curl_setopt($ch, CURLOPT_POST, true); 
curl_setopt($ch, CURLOPT_POSTFIELDS, "field1=value1&field2=value2"); 
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    'host: 127.0.0.1', 
    'accept: */*', 
    'content-length: 29', 
    'content-type: application/x-www-form-urlencoded' 
    ) 
); 

$theResponse = curl_exec($ch); 

print_r(curl_getinfo($ch)) ; 

這個腳本歷時每個被執行的時間爲10秒。

回答

0

該錯誤發生在我們的cURL包裝類中,它使用POST字段長度添加內容長度標題。這使頭被送到這樣的:

curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    'host: 127.0.0.1', 
    'accept: */*', 
    'content-length: 29', 
    'content-type: application/x-www-form-urlencoded' 
    ) 
); 

只要除去該數組中的Content-Length頭除去超時而執行平滑,因爲它應該的。我希望這可以幫助某人

+0

真正的問題是當cURL PHP庫在將數組傳遞到CURLOPT_POSTFIELDS時自動設置內容長度時設置內容長度。如果你自己設置,服務器可能會期待這些數據而不迴應。 – Khriz