在PHP中处理多个RSS源

时间:2011-08-04 05:01:24

标签: php rss feed

我有一张超过15000个Feed的表格,预计会增长。我想要做的是使用simplepie获取新文章,同步并将它们存储在数据库中。

现在我遇到了一个问题,因为Feed数量很多,我的服务器停止响应,我无法再提取Feed。我还实现了一些缓存,并以diff时间间隔提取奇数和偶数。

我想知道的是,有什么办法可以改善这个过程。也许,并行提取Feed。或者可能是因为有人可以告诉我伪造的算法。

3 个答案:

答案 0 :(得分:0)

15,000个饲料?你一定是疯了!

无论如何,一些想法:

  1. 增加脚本执行时间限制 - set_time_limit()
    不要过火,但确保你有足够的时间工作是一个开始。
  2. 跟踪Feed网址的上次检查
    也许为每个Feed last_check添加一个字段,并将该字段设置为该Feed最后一次成功提取的日期/时间。
  3. 处理较小批次
    最好经常运行较小的批次。可以把它想象成“相当于”不止一个篮子里的所有鸡蛋“的PHP。使用上面的last_check字段,可以轻松识别自上次更新以来时间最长的字段,并设置处理频率的阈值。
  4. 经常运行
    设置一个cronjob和进程,比如说每2分钟就有100条记录或类似的东西。
  5. 记录并查看您的效果
    有日志文件和记录统计信息。处理了多少条记录,自上次处理以来有多长时间,脚本需要多长时间。这些指标将允许您调整批量大小,cronjob设置,时间限制等,以确保以稳定的方式执行最大化检查。
  6. 与单个流程相比,设置所有这些可能听起来像很多工作,但它可以让您处理增加的用户量,并为您可能在轨道上看到的任何进一步维护任务奠定坚实的基础。 / p>

答案 1 :(得分:0)

  

使用simplepie同步获取新文章

“同步”是什么意思?你的意思是连续进入同一个过程吗?如果是这样,这是一种非常愚蠢的方法。

您需要一种分片数据的方式来跨多个进程运行。以声明方式执行此操作,比如提要ID的模数或URL的哈希值不是一个好的解决方案 - 一个慢的URL会导致多个提要被阻止。

更好的解决方案是启动多个线程/进程,每个线程/进程:

  1. 锁定网址Feed列表
  2. 确定过去最早的失效日期的Feed,该日期未标记为已保留
  3. 将此记录标记为已保留
  4. 解锁网址Feed列表
  5. 获取Feed并将其存储
  6. 删除此Feed列表中的保留标志并更新到期时间
  7. 请注意,如果在步骤2中没有过期记录,那么表应该被解锁,下一步取决于您是否将线程作为守护进程运行(在这种情况下,它应该实现指数后退,例如,睡眠为10对于连续迭代,秒数加倍,最多可达320秒)或者如果您正在批量运行,则退出。

答案 2 :(得分:0)

感谢您的回复。我道歉,我回复得有点迟了。我忙于解决这个问题,后来我忘记了这个帖子。

我一直在研究这个问题。面临很多问题。你看,每天15,000饲料并不容易。

  

可能我是MAD! :)但我确实解决了它。

如何?

我写了自己的算法。是的!它是用PHP / MYSQL编写的。我基本上实现了一个简单的加权机器学习算法我的算法基本上学习了有关Feed的发布时间,然后估算了Feed的下一个轮询时间。我把它保存在我的数据库中。

由于它是一种学习算法,因此随着时间的推移而改进。当然,有'未命中'。但这些失误比崩溃的服务器更好。 :)

我还写了一篇关于此的文章。已在当地计算机科学期刊上发表。

此外,关于性能提升,与顺序轮询相比,速度提高了500%至700%。

到目前为止怎么样?

我有一个TB已经增长的数据库。我正在使用MySQL。是的,我正面临关于MySQL的性能问题。但它并不多。最有可能的是,我将转移到其他数据库或实现对现有数据库的分片。

为什么选择PHP?

很简单,因为我想向人们展示PHP和MySQL能够做到这一点! :)