使用 PubSubHubbub 制作 RSS 定时器——Laravel RSS(三)

本文字数:5627,大概需要11.25分钟。

接下来还有待于继续优化,如向https://feed43.com/那样,输入 Web URL 就能生成 RSS Feed,又能根据实际需要自己设定更新时间等。

今天试着完成如何可以根据实际需要自己设定更新时间间隔时长。

订阅源更新解释

由于我们使用 xpath 方式去抓取网站的内容,这些网站更新了内容,但它们不会实时告诉你它们更新了;所以「RSS 阅读器如何做到所谓的的「更新」呢?」

要获取某个订阅源的文章更新,最基础而朴素的方法就是定时访问其 RSS 地址,检查对应的 XML 文件有无变化。

同时,第二个问题出现了,虽然可以检查 RSS 是否有更新,但怎么去通知我们的「订阅者」(如:IFTTT) 呢?

虽然 Google Reader 已经关闭了,但它留下了一份遗产 ——PubSubHubbub 协议。在 PubSubHubbub 协议下,每当内容发布者(Publisher)发布新的内容时,都会主动通知一个被称为 Hub 的第三方服务器,Hub 随即通过发送 HTTP POST 请求的方式,将更新情况和文章内容「推送」给曾经向其订阅过该内容源的订户(Subscriber),从而真正实现了「即时」更新。

实践中,RSS 服务往往扮演着上述三方关系中的订户角色,从而不再需要为了及时获取内容反复刷新订阅源,而只要等着 Hub 传来内容源主动通知的更新,「坐享其成」就行了。这大大降低了成本,也彻底消除了更新不及时的问题。至于这一协议中的枢纽——Hub 服务器,Google 则在当年自己搭建了一个,而且至今还在运营;另外,一家名叫 Superfeedr 的公司也公开提供 Hub 服务。

需要注意的是,所谓的「实时」只是相对的,通知的发送不可能快过 RSS 服务抓取到订阅源更新的时间,而我们已经知道后者往往存在不可避免的时间差。因此,实时推送功能的作用只是提醒我们不要错过关心的内容;要真正做到分钟级的先知先觉,当今媒体生态下恐怕还是直接瞄准社交网络更为靠谱。

以上文字内容更多来自:《2018 年主流 RSS 服务选哪家?Feedly、Inoreader 和 NewsBlur 全面横评》https://sspai.com/post/44420

实现更新功能

有了 PubSubHubbub 协议来支撑我们「自动更新」能力,那我们就可以完善我们的代码。

添加 interval 字段

默认间隔时间是 2个小时:

添加时间间隔选择框:

添加 Link Header

按照要求,需要添加两个 Link 到 RSS Header:

添加定时器

接下来我们就需要根据每个 RSS 自定义的时间间隔,利用 Laravel 的任务调度功能。

具体参考:https://laravel-china.org/docs/laravel/5.5/scheduling

使用调度器时,只需将以下 Cron 项目添加到服务器。

这个 Cron 会每分钟调用一次 Laravel 命令调度器。执行 schedule:run 命令时, Laravel 会根据你的调度运行预定任务。

每个更新时间间隔的 RSS 会比较多,而且都需要网络请求,所以这里的采用「队列任务调度」,而且是以每小时去执行一次:

创建任务

到了真正核心的地方了!

这里我们使用这个队列驱动,首先需要创建一个数据表来存储任务。可以用这个命令来创建这个数据表的迁移。当迁移创建好以后,就可以用这条命令来创建数据表:

修改为:

生成任务类

在 AutoUpdateRss 类执行查询满足条件的 xpaths,实时去触发 Hub 服务器,告知「订阅者」该更新了。

Laravel 的队列系统介绍,看这:https://laravel-china.org/docs/laravel/5.5/queues

查询方法

通知 Hub 方法

这里我们使用 Guzzlehttp://guzzle-cn.readthedocs.io/zh_CN/latest/quickstart.html,利用多线程异步请求,提高效率。

测试

万事俱备,只剩下测试,跑跑效果了,我们把时间改成每隔五分钟,去更新 RSS,我们还是利用「IFTTT 连接钉钉」的方法,看看效果:

总结

代码粗糙,但五脏俱全了,这过程主要使用了几个核心技术和工具:

Laravel 的任务调度

Laravel 的队列

Guzzle 网络请求插件

phubb - PHP PubSubHubbub server

让我们的 RSS Feed 有了定时器更新功能,下一步可以开始试着写写前端,做一个网站工具,让更多的人使用。

未完待续coding01 期待您继续关注

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180506G18HIK00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励