【问题标题】:Processing many rss/xml feeds in a cron file without overloading server在不超载服务器的情况下处理 cron 文件中的许多 rss/xml 提要
【发布时间】:2010-11-16 18:00:11
【问题描述】:

我有一个 cron 暂时每 20 分钟运行一次,但最终将每分钟运行一次。此 cron 将处理可能远程获取 XML 文件的数百个函数,并对其进行处理并执行其任务。问题是,由于远程站点的速度,此脚本有时可能需要一段时间才能运行。

有没有一种安全的方法可以做到这一点,而不会 [a] 脚本超时,[b] 使服务器超载 [c] 重叠并且在它再次运行之前在那一分钟内没有完成它的任务(这个错误会消失吗?)

不幸的是,缓存不是一种选择,因为数据几乎是实时变化的,并且来自多种来源。

【问题讨论】:

    标签: php cron


    【解决方案1】:

    我认为轻微的设计更改会大大有益于这个过程。鉴于远程服务器可能会超时,或者连接可能很慢,如果一个慢速作业在另一个作业启动时仍在写入文件,您肯定会遇到并发问题。

    我会将它分成两个单独的脚本。有一个脚本只用于获取最新的 XML 数据,另一个用于处理它。如果需要,提取脚本会花些时间,而进程脚本会不断寻找可用的最新文件以进行处理。

    这样它们可以独立运行,并且处理脚本始终可以处理最新数据,而不管脚本执行多长时间。

    【讨论】:

    • 好计划,这样在成功检索数据之前什么都不会发生。感谢您的提示!
    【解决方案2】:

    有一个堆栈来保存所有工作,有几个线程负责:

    • 从堆栈中弹出作业
    • 检查是否需要刷新 xml 文件(检查 etags、过期标头等)
    • 如果需要,获取 XML(这可能会花费一些时间,从而将负载分散到线程上),如果需要的时间太长,这应该超时,并提出它对某人所做的事实,因为您可能有一个站点下来,狡猾的 RSS 生成器或其他什么。
    • 然后处理它

    这样您每次都可以获取大量数据。

    可能您根本不需要抓取文件(如果您可以存储文件的最后一个 etag 等会有所帮助)

    一个提示,不要期望它们中的任何一个都是有效的格式。建议你看看 Mark Pilgrims RSS RegExp 阅读器,它在阅读大多数 RSS 方面做得非常好

    补充:我想说每分钟访问相同的站点对服务器来说并不是很好,并且会为您的服务器创建大量工作,您真的需要经常访问吗?

    【讨论】:

      【解决方案3】:

      您应该确保阅读您正在抓取的提要的<ttl> 标签,以确保您不会在它们更改之前不必要地抓取提要。 <ttl> 持有更新周期。因此,如果一个提要有<ttl>60</ttl>,那么它应该只每 60 分钟更新一次。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-16
        • 2016-12-12
        • 1970-01-01
        • 2020-02-01
        相关资源
        最近更新 更多