2012-06-21 38 views
3

我們的網站上有一個使用cURL從遠程域獲取XML數據的頁面。幾天前它隨機開始失敗(可能有1/3的請求失敗)。在使用我們的主機和遠程站點的操作員進行調試後,我們發現curl錯誤是「名稱查找超時」,表示DNS問題。我們的CURLOPT_CONNECTTIMEOUT設置爲5.當我將其更改爲30時,它每次都有效。PHP的cURL突然無法獲得IP地址,是file_get_contents一個很好的替代品嗎?

但是這是一個實時頁面,我不能讓遊客在等待響應時懸掛30秒。另外,增加的超時並不能回答爲什麼這首先失敗的問題。這個系統已經存在多年,5秒的超時時間一直很好。

此外,我發現如果我做dns_get_record(),它每次都有效,我很快就會得到一個有效的IP地址。所以我修改了腳本,首先執行dns_get_record(),然後我將cURL複製到它返回的IP地址,從而繞過cURL結尾處的名稱查找。它工作正常,但它很愚蠢。

所以,第一個問題,沒有人有任何建議,如何或爲什麼cURL可能會失敗。我們的主機和遠程站點的主機都同意它是某個DNS服務器,但都不同意誰的DNS服務器負責,因爲他們都表示他們自己的服務器是好的,而且我們的主機說他們可以ping通遠程域而沒有問題。

第二個問題,是file_get_contents()足夠替換dns_get_record() + cURL?或者我應該堅持使用dns_get_record() + cURL?

+1

如果是故意設置的遠程服務器那麼即使將其切換到file_get_contents,您也無法控制失敗。你是否比遠程服務器調用速度快得多? – mauris

+0

@mauris不,每次這個頁面被擊中時,這只是一個請求。這是一個受歡迎的頁面,所以它可能會經常訪問,但每個訪問都是分開的。另外請注意,dns_get_record()總是成功,所以它可能不同於cURL來獲得IP地址?如果是這樣,也許file_get_contents()的作品類似? –

+0

如果服務器需要更多時間,請升級遠程服務器以提高速度,或者使用AJAX – mauris

回答

2

在引擎蓋下,curl_execfile_get_contents執行幾乎相同的操作;它們都使用libresolv到:

  1. 連接到一個名稱服務器
  2. 問題的DNS請求
  3. 過程中的DNS響應

進一步調試這一點,你可以用curl_getinfo()獲得詳細的統計數據關於你的要求;你可以用它來獲取的每一個部分使用了多長時間了一個想法:

  • CURLINFO_NAMELOOKUP_TIME
  • CURLINFO_CONNECT_TIME
  • CURLINFO_PRETRANSFER_TIME
  • ...
相關問題