【问题标题】:Building RSS from other RSS feeds, how to prevent loop / recursion / circular inclusion?从其他 RSS 提要构建 RSS,如何防止循环/递归/循环包含?
【发布时间】:2013-05-07 08:21:32
【问题描述】:

这是一个 RSS 源 (A),用户可以在其中添加多张图像,但他/她也可以添加来自不同用户的带有图像的 RSS 源 (B)。当请求提要 (A) 时,服务器会获取提要 (B),然后将提要中的图像添加到请求的提要 (A) 中。

有哪些机制或选项可以防止无限循环递归?
例如当饲料(B)还包括饲料(A)时

// Feed A setup
// - image1a
// - image2a
// - feed-B

// Feed B setup
// - image1b
// - feed-A

// fetching / assembling feed A
// - image1a
// - image2a
// - (A fetches feed-B)
// - image1b
// - (B fetches feed-A)
// - image1a
// - image2a
// - (fetched A fetches feed-B again)
// - image1b
// - (second B fetches feed-A again)
// .. recursion

【问题讨论】:

  • 您能否展示您的代码以供进一步参考?这样我们都可以知道你在做什么?
  • 伪代码或多或少,foreach($items); if($feed) simplexml_load_file($feed); addfeedimages(); - 我开始考虑为单个图像添加唯一的 feed_id,这样如果 feed A 在来自外部 feed 的图像中遇到它自己的 feed_id 之一,则可能会发生递归。如果提要播放器可以忽略 RSS XML 项上的这些额外的 feed_id 节点,这可能会起作用。然而!如果递归发生在提要 (B) 和提要 (C) 之间,那么提要 (A) 将不知道。
  • 如果没有示例代码,就很难为您的查询编写完整的代码。你必须展示一些代码工作。然后我们可以提供帮助。

标签: php recursion rss infinite-loop


【解决方案1】:

有三种解决方案:

  • 将原始提要 ID 与每个项目一起存储,并仅转发最初为每个提要创建的项目,
  • 或转发每个提要的所有项目,并传递项目所在的所有提要的列表(并检查该列表),
  • 或为每个 RSS 使用唯一的 itemID,只存储一次,在 itemID 上放置唯一的约束或主键,这样就不会为每个提要存储两次。

【讨论】:

  • 感谢您的回答。问题是在组装提要时,会获取外部提要。没有办法阻止其他提要获取此提要,因此我使用了文件锁。我尝试添加自己的 feed-id,但最终依赖于 guid。如果其他提要可以具有相同的图像(来自 sha1 的相同 guid),那么我也向 guid 添加了一个唯一的 id。
【解决方案2】:

事实证明,解决方案分为几个阶段。

1 锁定:根据请求返回缓存 XML 的副本。在构建提要 XML 期间,设置一个锁。这可以防止正在获取此提要的外部提要触发第二个新构建。外部提要只会接收缓存的 XML。

2 识别项目:锁会阻止潜在的失控进程,但提要 XML 确实会在每次请求时使用先前缓存的 XML 项目增长。为防止重复,为每个“guid”字段添加一个唯一标识符。如果某个项目是供稿所有的,请不要包含它并记录一条消息(并在需要时通知)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-08
    • 1970-01-01
    • 2018-09-06
    • 1970-01-01
    • 1970-01-01
    • 2014-04-30
    • 2012-03-04
    • 1970-01-01
    相关资源
    最近更新 更多