代码之家  ›  专栏  ›  技术社区  ›  ThoKra

优化饲料获取

  •  1
  • ThoKra  · 技术社区  · 16 年前

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

    关于如何在PHP中以最佳方式做到这一点,有什么想法吗?

    4 回复  |  直到 16 年前
        1
  •  3
  •   puzz    16 年前

    如果我理解你的问题,你基本上是在一个feed agregator网站上工作吗?

    您可以执行以下操作:;例如,从每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”,“refresh”是上次刷新feed的时间戳,“refresh_interval”是同一feed的两次获取之间的所需时间间隔。

        2
  •  2
  •   Stefan    16 年前

    根据新的信息,我想我会做这样的事情:

    让“第一个”客户端启动更新工作并存储时间戳。 Everey其他会要求提供信息的客户会得到一个兑现的信息,直到这些信息太旧。客户的下一次点击将刷新所有客户使用的现金,直到下次它变旧。

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

    这样你就不必更新了 任何事物 如果没有客户端请求它。

        3
  •  0
  •   Brian C. Lane    16 年前

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

        4
  •  0
  •   Dustin    16 年前

    我写的 pfetch 它很小,但有几个非常重要的方面:

    1. 它是用twisted编写的,即使网络速度很慢,也可以处理大量并发。
    2. 它不需要任何克戎骑师或任何东西。

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