我正在使用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
我应该实施哪种错误检查以避免在页面上显示警告?
答案 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()
的“@”运算符可能是最好的。