如何对simplexml_load_file进行错误检查?

ann*_*nna 2 php error-handling

我正在使用Tumbrl API将一些帖子加载到我的主页上.我有以下电话:

$xml = simplexml_load_file($request_url);
Run Code Online (Sandbox Code Playgroud)

偶尔它加载很好,但有时我得到这个输出:

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
Run Code Online (Sandbox Code Playgroud)

我应该实施什么样的错误检查以避免在页面上显示警告?

tho*_*ter 5

检查此函数失败的方法是检查false返回值.

simplexml_load_file在失败时也会触发旧式的PHP警告.如果您已打开警告但想要因任何原因禁止警告,则可以使用@:

所以,你可以使用

$element = @simplexml_load_file($file);
if ($element === false) {
  // error!
}
Run Code Online (Sandbox Code Playgroud)

请注意,警告可能是可能出现问题的指示.如果您正在读取文件,但不确定该文件是否存在,您是否小心避免安全问题?例如,用户是否能够读取系统上的任何文件?

2014年3月更新

作为一个警告,我应该补充说,使用"@"运算符来抑制错误通常是一个坏主意.如果有替代方案,您应该使用它.如果没有替代方案,则应尝试将"@"所涵盖的部分限制为尽可能小的部分.

原因是"@"会覆盖您全局设置的任何错误处理设置(与error_reporting()代码中的设置相同).因此,如果您将PHP设置为记录错误而不是显示它们,例如,甚至不会记录此错误.也很容易意外地抑制比"@"更多的错误,包括你想知道的错误.例如,using @myfunction($something)将抑制在该函数中的任何位置发生的错误,或者依次调用函数调用的函数.因此,这只是关于该运营商的一些事项.

在这种情况下,因为您通过HTTP检查远程文件,所以使用"@"的常用方法并不理想.例如,对于本地文件,您可以使用以下内容来避免"@":

if (file_exists($file)) {
  $element = simplexml_load_file($file);
}
else {
  // error!
}
Run Code Online (Sandbox Code Playgroud)

但在你的情况下,因为它是通过HTTP调用远程文件,上面会导致两个请求,如果第一个请求成功但第二个请求失败,则会出现错误.在您的情况下,特别限于您的"@"操作员simplexml_load_file()可能是最好的.