2011-07-28 40 views
2

我正在使用Tumbrl API將一些帖子加載到我的主頁上。 我有以下電話:如何對simplexml_load_file進行錯誤檢查?

$xml = simplexml_load_file($request_url); 

有時它加載罰款,但其他時間我得到這個輸出,而不是:

Warning: simplexml_load_file(http://mysite.tumblr.com/api/read?type=post&start=0&num=10&type=photo) [function.simplexml-load-file]: failed to open stream: HTTP request failed! HTTP/1.1 503 Service Temporarily Unavailable in mysite.com/html/index.php on line 624 

Warning: simplexml_load_file() [function.simplexml-load-file]: I/O warning : failed to load external entity "http://mysite.tumblr.com/api/read?type=post&start=0&num=10&type=photo" in mysite.com/html/index.php on line 624 

我應該執行什麼樣的錯誤檢查,以避免在網頁上展示的警告?

回答

5

檢查此功能失敗的方法是檢查false返回值。

simplexml_load_file在失敗時也會觸發舊式PHP警告。如果你有警告打開,但要抑制無論出於何種原因的警告,你可以使用@

所以,你可以使用

$element = @simplexml_load_file($file); 
if ($element === false) { 
    // error! 
} 

注意,警告可能是可能出現的問題的一個指標。如果您正在閱讀文件,但不確定該文件是否存在,是否小心避免安全問題?例如,用戶是否可以讀取系統上的任何文件?

更新2014年3月

作爲一個警告,我要補充一點,用「@」操作符來抑制錯誤是一般一個壞主意。如果有替代方案,您應該使用它。如果沒有其他選擇,則應儘量將「@」所覆蓋的部分限制在最小的部分。

原因是「@」會覆蓋您在全局設置的任何錯誤處理設置(與在代碼中設置error_reporting()的方式相同)。因此,如果您設置PHP記錄錯誤而不是顯示它們,例如,甚至不會記錄此錯誤。意外地抑制更多的錯誤比您想要使用「@」更容易,包括您想知道的錯誤。例如,使用@myfunction($something)將抑制在該函數中的任何位置發生的錯誤,或者在依次調用函數的函數中抑制錯誤。所以這只是關於該操作員的一些事情。

在這種情況下,因爲您正在通過HTTP檢查遠程文件,所以通常使用「@」的替代方法並不理想。例如,對於本地文件,你可以使用以下,以避免「@」:

if (file_exists($file)) { 
    $element = simplexml_load_file($file); 
} 
else { 
    // error! 
} 

但在你的情況,因爲它是通過HTTP遠程文件的調用,上面會導致兩個要求,如果第一個請求成功但第二個失敗,你會得到一個錯誤。在你的情況下,一個「@」運營商特別限於你的simplexml_load_file()可能是最好的。

+0

「@」符號在這裏爲我做了!謝謝!!! – anna

+0

這也適用於我。謝謝! –

+0

對於爲什麼** NOT **使用'@'符號來處理錯誤消息的奇妙解釋。 'file_exists($ file)'完美地工作。謝謝。 –