【发布时间】:2011-11-14 15:58:09
【问题描述】:
我正在构建一个从不同站点读取 rss 提要的网络应用程序。在每个提要上,我都可以在 url 中添加一个搜索键,因此提要总是不同的。
现在我正在使用 simplexml_load_file,但这需要很长时间才能读取提要。今天我在stackoverflow上搜索并找到了XMLReader类。这有点快,但还不够快。
我的问题是,有没有一种更快的方法来读取多个始终唯一的 rss 提要,这样用户就不必等待这么长时间了。
【问题讨论】:
我正在构建一个从不同站点读取 rss 提要的网络应用程序。在每个提要上,我都可以在 url 中添加一个搜索键,因此提要总是不同的。
现在我正在使用 simplexml_load_file,但这需要很长时间才能读取提要。今天我在stackoverflow上搜索并找到了XMLReader类。这有点快,但还不够快。
我的问题是,有没有一种更快的方法来读取多个始终唯一的 rss 提要,这样用户就不必等待这么长时间了。
【问题讨论】:
查看simplePie - 该库非常易于使用,并且实现了运行良好的缓存。
您可以做的另一件事是加快感知加载时间,即在没有提要内容的情况下加载页面,然后使用 AJAX 管道输入提要。如果您将加载器动画图像粘贴在提要所在的内容区域并在页面加载时启动 AJAX 请求,用户会感觉到您的页面加载速度更快 - 即使提要采用相同的总数,它也会更快地可用加载时间。此外,那些不在场的用户可以开始做他们需要做的事情,而无需等待他们甚至不关心的内容。
【讨论】:
为什么不在有用户请求时随机包含的文件中缓存 5 或 6 个提要。这样,用户就不会等待处理提要。缓存文件可以通过 cron 作业每 10 或 15 分钟刷新一次,因此总是有新鲜的内容。
【讨论】:
好的,我使用了不同的 rss 解析器,例如: - 简单派 - 最后RSS
但最快的方法是使用 PHP XMLReader,因为您不必读取整个 xml 文件。
【讨论】:
我认为您需要做的不是阅读整个 RSS Feed 并对其进行解析,而是仅获取其中的一部分。如果你使用file_get_contents(),你可以设置一个限制,不下载整个页面,而只下载第一部分。
当然,您的 RSS 提要已损坏。我现在不知道你的读者对此有何反应。也许您可以让他忽略它或修复损坏的提要端。
给你:
$feed = file_get_contents('http://stackoverflow.com/...', false, null, -1, 1000);
$end = strpos($feed, '</entry>', -1);
echo substr($feed, 0, $end). '</entry></feed>';
【讨论】:
file_get_contents 可能是读取数据的最佳方式,但您建议只读取文档的一部分并不是一个好的建议。开发人员如何知道要获取多少文档,这样他就不会在中间截断文章,甚至不截断中间的标签?那么您得到了一个无法正确解析的无效 XML 文档。另外,拼写检查会不会很痛苦?
file_get_contents 处抛出一些任意的max_len 参数,你不知道你会得到什么。可能是除最后一篇文章外的所有内容,可能是第一篇文章的 1/3。您也没有简单的方法来“修复损坏的提要”,因为您不知道自己剪掉了什么。与刚刚检索整个提要相比,您将花费更多的执行时间来试图找出需要“修复”和有效的损坏 XML 的混乱。你最好不要一开始就破坏它。 -1