2012-12-10 60 views
2

我正在使用一個簡單的cURL語句來解析我的網站上的XML。當API啓動並運行時,它可以正常工作,但是一旦API由於任何原因而停機,整個站點就會崩潰。使用cURL XML沒有響應

$url = 'http://www.mydomain.com/webservicexample'; 
$ch = curl_init($url); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_HEADER, 0); 
$data = curl_exec($ch); 
curl_close($ch); 

$xml = new SimpleXmlElement($data); 

有一個條件,我可以把周圍的網址,使其只進行是否有來自API的積極響應捲曲腳本?我嘗試以下,但它並沒有工作,因爲它從來沒有得到一個服務器響應給任何標題:

$url_headers = @get_headers($url); 
if($url_headers[0] == 'HTTP/1.1 200 OK') { 

    // do script 
} 

任何幫助/諮詢非常感謝!

+1

您是否嘗試在get_headers()之前移除'@'以顯示任何錯誤? –

+0

查看錯誤日誌以查看哪個錯誤正在崩潰腳本。 – Ranty

+0

@Titanium - 我試過這個,但它仍然沒有工作 –

回答

1

可以檢查curl_exec()返回值:

if (false === ($data = curl_exec($ch))) { 
    die("Eek! Curl error! " . curl_error($ch)); 
} 

並檢查響應頭太:

if (200 !== (int)curl_getinfo($ch, CURLINFO_HTTP_CODE)) { 
    die("Oh dear, no 200 OK?!"); 
} 
+0

感謝您的輸入,我的答案正在爲我工​​作,但您的看起來應該也能工作。 –

+0

@AdamMoss沒問題,我的回答只解決了知道請求何時失敗的部分(無論什麼原因);它沒有考慮到應該設置超時以避免在放棄之前等待60秒。 –

0

最後我能得到它的工作通過設置超時時間CURLOPT_TIMEOUT和CURLOPT_CONNECTTIMEOUT,然後使用curl_errno()在它周圍放置一個條件。

$ch = curl_init($url); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
    curl_setopt($ch, CURLOPT_HEADER, 0); 
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 3); 
    curl_setopt($ch, CURLOPT_TIMEOUT, 3); 
    $data = curl_exec($ch); 

    if(!curl_errno($ch)) 
    { 
     curl_close($ch); 
     $xml = new SimpleXmlElement($data); 
     return $xml; 
    }