【问题标题】:Optimize feed fetching优化提要获取
【发布时间】:2010-09-24 21:11:07
【问题描述】:

我现在正在开发一个必须获取用户供稿的网站。但是,如果我有一个包含 300 个提要的数据库,我如何才能最好地优化获取。我将设置一个 cron-job 来获取提要,但我应该像每秒钟 5 次那样做吗?

关于如何在 PHP 中以最佳方式做到这一点的任何想法?

【问题讨论】:

    标签: php mysql cron feed fetch


    【解决方案1】:

    如果我理解您的问题,您基本上是在处理提要聚合器网站?

    您可以执行以下操作;首先每 1 小时刷新一次(例如)。当您从某个提要中获得足够的条目时 - 计算条目之间的平均间隔。然后将该时间间隔用作获取该提要的时间间隔。

    例如,如果该网站在过去 7 天内发布了 7 篇文章 - 您可以每 24 小时(1 天)从中获取一次供稿。

    我使用这个算法进行了一些更改,当我计算这个平均间隔时,我将它除以 2(以确保不会太少地获取)。如果结果小于 60 分钟 - 我将间隔设置为 1 小时或大于 24 分钟,我将其设置为 24 小时。

    例如,像这样的:

        public function updateRefreshInterval() {
                $sql = 'select count(*) _count ' .
                        'from article ' .
                        'where created>adddate(now(), interval -7 day) and feed_id = ' . (int) $this->getId();
                $array = Db::loadArray( $sql );
    
                $count = $array[ '_count' ];
    
                $interval = 7 * 24 * 60 * 60 / ( $count + 1 );
                $interval = $interval / 2;
                if( $interval < self::MIN_REFRESH_INTERVAL ) {
                        $interval = self::MIN_REFRESH_INTERVAL;
                }
                if( $interval > self::MAX_REFRESH_INTERVAL ) {
                        $interval = self::MAX_REFRESH_INTERVAL;
                }
    
                Db::execute( 'update feed set refresh_interval = ' . $interval . ' where id = ' . (int) $this->getId() );
        }
    

    表格是“feed”,“refreshed”是上次刷新 feed 时的时间戳,“refresh_interval”是两次提取同一 feed 之间的所需时间间隔。

    【讨论】:

      【解决方案2】:

      根据新信息,我认为我会这样做:

      让“第一个”客户端启动更新工作并用它存储时间戳。 其他要求提供信息的客户都会获得兑现的信息,直到该信息过时为止。来自客户端的下一次命中将刷新然后将由所有客户端使用的现金,直到下一次它变旧。

      实际启动更新工作的客户端不必等待它完成,只需提供旧的兑现版本并继续执行直到工作完成。

      这样,如果没有客户请求,您就不必更新任何内容

      【讨论】:

        【解决方案3】:

        最好的办法是保持“友善”,不要因大量不必要的请求而使提要过载。我为我的一个 web 应用程序确定了 1 小时的更新时间,该应用程序监视大约 150 个博客的更新。我将上次检查它们的时间存储在数据库中,并使用它来决定何时更新它们。提要是随机添加的,因此它们不会同时更新。

        【讨论】:

          【解决方案4】:

          我写了pfetch 来为我做这件事。它很小,但有几个非常重要的方面:

          1. 它是用 twisted 编写的,即使在网络速度很慢的情况下也可以处理大量并发。
          2. 它不需要任何 cron jockeying 或任何东西。

          我之所以写它,是因为我的基于 cron 的 fetcher 正在成为一个问题。现在我将它配置为在互联网上获取一些我想要的随机内容,然后在事情发生变化时运行脚本以更新我自己网站的某些部分。

          【讨论】:

            猜你喜欢
            • 2015-07-07
            • 1970-01-01
            • 1970-01-01
            • 2013-02-14
            • 2016-01-05
            • 2021-04-05
            • 1970-01-01
            • 2013-03-10
            • 2016-07-15
            相关资源
            最近更新 更多