检查有效的xml,然后检查rss-feed的响应时间

时间:2011-11-07 07:36:49

标签: php xml rss-reader

我正在阅读RSS订阅源并查看我想知道它需要多长时间才能调用

    $homepage = file_get_contents('http://www.forbes.com/news/index.xml');

为此我正在使用

 <?php

$start = microtime(true);
$homepage = file_get_contents('http://www.fohgggrbes.com/news/index.xml');
 $end = microtime(true);
 $dur=$end-$start;
 echo $dur;
  $xml = simplexml_load_string($homepage,'SimpleXMLElement', LIBXML_NOCDATA);
  echo '<pre>';
?>

但我的要求是首先我检查文件是否有效xml,如果是,则显示响应时间

 $homepage = file_get_contents('http://www.forbes.com/news/index.xml');

或 如果XML文件无效,则显示错误消息。我想使用try和catch异常。

2 个答案:

答案 0 :(得分:1)

检查URL是否有效与检查XML是否有效不同。当您尝试加载无效的URL时,错误通常类似于

  

无法打开流:php_network_getaddresses:getaddrinfo失败

但是,该错误源于流包装器,而之后的任何XML验证都是由libxml完成​​的。因此,您需要检查两个不同的东西。以下代码将考虑到这两点:

libxml_use_internal_errors(true);
$start = microtime(true);
$rss = @simplexml_load_file(
    'http://www.fohgggrbes.com/news/index.xml',
    'SimpleXMLElement',
    LIBXML_NOCDATA
);
$end = microtime(true);
$errors = array_filter(
    array(error_get_last(), libxml_get_errors()),
    function($val) { return !empty($val); }
);
print_r(empty($errors) ? $end - $start : $errors);
libxml_use_internal_errors(false);

如果你想使用try / catch,我可以把它包装成一个类并抛出异常。

答案 1 :(得分:0)

我认为您可以随时使用CURL将检索到的数据提交给W3C Feed验证程序(http://validator.w3.org/feed/),或者将URL发送给验证程序(即可能是更好的方法,因为你移动较少的数据),但处理返回的结果可能是棘手的(结果是一个HTML文档,意味着人类可读而不是机器可读)。