代码之家  ›  专栏  ›  技术社区  ›  Helen Neely

更新XML数据时只读

  •  2
  • Helen Neely  · 技术社区  · 15 年前

    我可以用PHP解析RSS- 我要寻找的是能够只获取更新的内容,如果没有新的RSS更新,什么也不做。

    例如,我有这个 RSS File 如果没有新的内容,什么也不会发生,但是如果有新的内容,我想向我的用户发送最新的RSS更新,而不是重新发送他们已有的内容。我只解析和发送标题和链接。

    我使用cronjob每小时检查一次更新。我的问题是,如何才能知道提要现在已更新,与上一个提要不同?这里是 PHP file 我用来读RSS的。是否将最后一个内容写入文件并进行比较,或者是否有其他方法确定内容现在与最后一个内容不同?

    更新: 我不得不恢复这篇文章,因为我仍在努力让它发挥作用。虽然我接受了一些答案,但它们很难实现,例如,哈希选项最初看起来是一个好主意,但是由于要检查数千个RSS,几乎不可能将它们全部哈希。

    再次,有人建议HTTP缓存-我找不到一个简单的演示,所以我几乎卡住了。

    任何进一步的建议都将受到高度赞赏。

    5 回复  |  直到 15 年前
        1
  •  5
  •   Henrik Opel    15 年前

    您可以通过以下两种方式使用哈希:

    1. 为了方便更新—请求更新时,您散列整个源并将结果与上次的散列进行比较—如果它们相同,您知道源没有更改,甚至可以在分析它之前停止。
    2. 为了识别更改——在解析时,您散列每个项,并将其与以前运行中存储的散列进行比较。如果它和一个匹配,你就知道你以前见过它。

    如果有问题的提要为其项提供了guid,则可以通过存储guid<>哈希对来优化此过程。这将使比较更快,因为您只会将项目与已知的以前版本进行比较,而不是与所有以前的项目进行比较。

    您仍然需要一些过期/清除机制来将存储的哈希数量保持在界限内,但是考虑到您只存储相对较短的字符串(取决于所选的哈希算法),您应该能够在出现性能问题之前保留相当多的积压工作。

        2
  •  3
  •   Jason A. Lefkowitz    15 年前

    HTTP Conditional GET 可能和你想要的一样接近。

        3
  •  1
  •   Gennady Shumakher    15 年前

    由于RSS的多样性,对于您提出的问题没有简单的解决方案。 主要问题是如何确定RSS项目的唯一性。它可以是guid、发布时间或内容本身,但可能很难自动检测到。

    一旦你知道了唯一性标准,你就可以保存所有“旧”项目,并将它们与你收到的最新项目进行比较。

    HTTP缓存控制和Expires头可以用作支持该功能的站点的优化,但不幸的是,有些没有。

        4
  •  1
  •   Corey Ballou    15 年前

    @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());
    
        5
  •  0
  •   Cody Caughlan    15 年前

    你的客户会一直要求你的饲料数据,所以你不一定要控制 什么时候? 他们问。我认为大多数提要阅读器不遵守HTTP缓存控制/过期头,因此您不能依赖于使用HTTP规范和利用HTTP缓存。

    我认为您最好的选择是缓存上一个响应并从缓存发送所有后续请求—在进行更改时适当地更新缓存。实际上,这意味着,如果您只是从memcache或文件系统中提取数据,那么响应每个客户机及其过时数据的成本几乎接近于0。