我能用PHP解析RSS - 我正在寻找的是能够只获得更新的内容,如果没有新的RSS更新,则什么都不做。
例如,我有这个RSS File,如果没有新内容,没有任何反应,但如果有新内容,我想向我的用户发送最新的RSS更新,而不是重新发送已有的内容。我正在解析并仅发送标题和链接。
我使用cronjob检查每小时的更新。我的问题是如何判断Feed现在已更新,与上一个不同?这是我用来阅读RSS的PHP file。我是否将最后一个内容写入文件并进行比较,还是有其他方法可以确定内容现在与上一个内容有什么不同?
更新:我不得不复活这篇文章,因为我仍然试图让它发挥作用。虽然我接受了一些答案,但它们很难实现,例如哈希选项最初看起来是个好主意,但是当检查数千个RSS时,几乎不可能将它们全部哈希。
再一次,有人建议使用HTTP Cache - 我找不到一个简单的演示,所以我几乎被卡住了。
任何进一步的建议都将受到高度赞赏。
答案 0 :(得分:5)
你可以用两种方式使用哈希:
如果有问题的Feed为其项目提供了guid,您可以通过存储guid<>哈希对来优化此过程。这样可以更快地进行比较,因为您只会将项目与已知的先前版本进行比较,而不是与之前的所有项目进行比较。
你仍然需要一些过期/清除机制来保持存储的哈希值在边界内,但鉴于你只存储相对较短的字符串(取决于所选的哈希算法),你应该能够保持积压在遇到性能问题之前。
答案 1 :(得分:3)
HTTP Conditional GET可能就像你要达到你想要的那样接近。
答案 2 :(得分:1)
由于rss的多样性,你提出的问题并不容易解决。 主要问题是如何确定rss项的唯一性。它可以是guid,发布时间或内容本身,但自动检测它可能很棘手。
一旦您了解了唯一性标准,就可以保留所有“旧”项目,并将它们与您收到的最新项目进行比较。
HTTP缓存控制和过期标头可用作支持该网站的网站的优化,但遗憾的是有些网站不支持。
答案 3 :(得分:1)
@ Henrik的解决方案是正确的,但最简单的方法是为您提供散列数据的示例:
// hash the three channel variables
$hash = sha1($channel_title . $channel_link . $channel_desc);
// here you should check the currently stored database hashed
// value against current hash value to see if any channel variables
// have recently changed
if ($database_hash != $hash) {
// you need to update the channel data in your database
// including the new hash value
}
for ($i = 0; $i < 3; $i++) {
// hash the item values
$hash = $item_title . $item_link . $item_description
// here you should check the currently stored database hashed
// value against all item hash values to see if any item variables
// have recently changed
if ($database_hash != $hash) {
// you need to update the item data in your database
// including the new hash value
}
}
此外,如果要快速检查以确定XML文件中的任何数据是否已更改,则可以将XML作为字符串进行哈希处理。您应该存储此值并在每次运行cronjob时检查它以查看值是否已更改(表示XML文件中的某些数据已更改)。
$overall_hash = sha1($xmlDoc->saveXML());
答案 4 :(得分:0)
您的客户始终会询问您的Feed数据,因此您无法在时询问。我不认为大多数提要阅读器遵守HTTP Cache Control / Expires标头,因此您不能依赖于使用HTTP规范并利用HTTP缓存。
我认为最好的办法是只缓存上一个响应并从缓存中发送所有后续请求 - 在进行更改时适当更新缓存。实际上,这意味着如果您只是从memcache或文件系统中提取它,那么响应每个客户端及其陈旧数据的成本几乎接近于0。