【问题标题】:RSS aggregator; how to insert only new itemsRSS 聚合器;如何仅插入新项目
【发布时间】:2013-05-24 16:40:10
【问题描述】:

tutorial here 展示了如何在 PHP 中构建聚合器,但我在寻找不在我的数据库中插入相同项目的最佳方法时遇到了一些麻烦。

如果我在 http://visualwebsiteoptimizer.com/split-testing-blog/feed/ 上运行脚本,然后在 5 分钟内再次运行它,它只会再次插入相同的项目。

该教程只指定了一个间隔时间,它将重新加载 RSS 提要并保存所有项目。

我想知道 RSS 是否实现了一些仅在特定日期之后发送项目的请求标头。我看到here 我可以使用 lastBuildDate 并且可能会忽略日期早于上次获取的频道,但它没有说明这是否是强制性的。

我的问题是:如何定期检查 RSS 提要并将其插入数据库而不多次插入同一项目?

我认为唯一的方法是使用链接检查记录是否已经存在,并且仅在它不存在时才插入。我知道链接是可选的,但我不会保存没有链​​接的项目。不过,这似乎有点低效;在每次插入之前检查一开始可能没问题,但是当数据库开始填满时,它可能会变得很慢。

【问题讨论】:

    标签: php rss


    【解决方案1】:

    您可能需要使用几种不同的策略,具体取决于您使用的网站对规范的实施情况。

    首先我会尝试在数据库上为 GUID 值添加一个唯一索引,GUID 本质上应该是唯一的,http://en.wikipedia.org/wiki/Globally_unique_identifier - 然后根据您使用的数据库,您应该能够使用类似 INSERT IGNORE INTO... 的语法或INSERT ... ON DUPLICATE KEY UPDATE...,只是更新语法并没有真正做任何事情

    如果某些网站没有 guid 字段(我假设您最终会消耗的不仅仅是示例),您可以在 siteId 字段和时间或标题上添加唯一性,两者都小于当然,理想的情况是联系自己的网站以让他们实施 guid 也可以;)

    您还可以在帖子内容上运行 md5 哈希并将其存储在帖子旁边,这也应该阻止重复。

    您希望数据库有多大?通过适当的索引,我会认为它在运行缓慢之前必须很大; siteId、guid、时间和/或哈希上的索引,并且仅限于 1 行,并且只有 rowId 应该足够快,如果您可以让脚本在 cron 作业而不是通过网络服务器上运行命令行/ epscialyl

    【讨论】:

    • 感谢您的回复,我正在考虑对链接值设置唯一约束(如果没有要链接的文章,我不会保存它)。 Atom 似乎有多个带有编辑、自我和备用属性的链接元素,所以我必须检查如何保存这些元素。将有大约 250 个提要要阅读,所以我假设项目是按时间顺序排列的。当链接在数据库中时,它将停止处理其余部分。这可能会导致一些问题,但会密切监视它。每天将归档超过 7 天的所有内容。还不确定会有多少项目。
    • 我有点希望 RSS 有一些实现,仅提供基于某些 http 请求标头尚未获取但找不到的项目。这可能是因为它不存在,如果存在,则无法保证网站会实施它。
    • 我没听说过这种东西,而iirc RSS代表Really Simple Syndication,所以我看不出它有很多高级功能。另外,从提供商的服务器角度来看,如果每个使用您的 RSS 提要的人都传递了不同的参数,那么它真的会受到影响。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-12
    • 1970-01-01
    • 2014-04-23
    • 1970-01-01
    相关资源
    最近更新 更多