2013-09-25 136 views
4

我正在處理大量通過SOAP連接處理大量數據的PHP腳本。如果腳本沒有遇到任何錯誤,則估計腳本的總運行時間爲幾天。我遇到的問題是腳本將運行一段時間,從一個小時到一天,然後SOAP連接將死亡,並顯示錯誤"error fetching http headers"php肥皂錯誤獲取http標題

我見過很多文章建議增加default_socket_timeout設置,我試過這個。它沒有幫助。我知道這是行得通的,因爲它在失敗之前至少會有一百次成功的通話。有什麼我可以做的,以阻止這個錯誤?

更新
我打印出希望在那裏看到錯誤的請求和響應標頭。但現在看來,他們都很好:

HTTP/1.1 200 OK
日期:星期三,2013年9月25日21點零零分12秒GMT
服務器:Apache/2.2.15(CentOS的)
X-供電-By:PHP/5.3.3
Content-Length:516
Connection:close
Content-Type:text/xml;字符集= UTF-8

儘可能示例代碼變爲實際的腳本是瘋狂的長,但基本前提是:

ini_set('default_socket_timeout', 120); 
$client = new SoapClient($wsdl,array(
    'trace' =>true, 
    'connection_timeout' => 500000, 
    'cache_wsdl' => WSDL_CACHE_BOTH, 
    'keep_alive' => true, 
)); 
while(!$finished) { 
    $finished = $client->someSoapFunction($data); 
} 

someSoapFunction()將返回有效的數據連接的100,然後隨機回到我上面的錯誤。運行的時間少於設置的超時時間。我沒有在我的PHP或Apache錯誤日誌中的錯誤。我很難過。

+2

問題 - 幷包含有效的代碼來重現它 - 在問題本身中。 – Kermit

回答

6

我知道這是一個老問題,但也許我的解決方案可能對其他人有用。 我有同樣的問題,並通過更改「KEEP_ALIVE」參數設置爲創建SoapClient的對象的假,我的問題解決了:關於你已經寫了必須說明具體問題代碼問題

$client = new SoapClient($wsdl,array(
'trace' =>true, 
'connection_timeout' => 500000, 
'cache_wsdl' => WSDL_CACHE_BOTH, 
'keep_alive' => false, 
)); 
+0

據我所知,該解決方案僅適用於PHP> = 5.4,因爲在較低版本中,keep_alive選項不可用。但它應該可以在您的網絡服務器的配置 – xmoex

+0

謝謝了,經過3天的搜索,終於解決了我們的問題。 – Bas