如何对simplexml_load_file进行错误检查?

时间:2011-07-28 02:14:22

标签: php error-handling

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

$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

我应该实施哪种错误检查以避免在页面上显示警告?

1 个答案:

答案 0 :(得分: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()的“@”运算符可能是最好的。