优化Feed提取

时间:2008-12-02 03:51:34

标签: php mysql cron feed fetch

我正在开发一个必须获取用户Feed的网站。但是,如果我有一个数据库,比方说300个提要,我怎样才能最好地优化提取。我要设置一个获取提要的cron-job,但是我应该每隔一分钟做一次这样的事情吗?

关于如何在PHP中实现这一目标的最佳方法?

4 个答案:

答案 0 :(得分:3)

如果我理解你的问题,你基本上是在饲料agregator网站上工作?

您可以执行以下操作;从刷新每一个hor(例如)开始。当您从某个Feed中输入足够的条目时 - 计算条目之间的平均间隔。然后使用该间隔作为获取该Feed的间隔。

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

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

例如,像这样:

    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”,“刷新”是上次刷新Feed时的时间戳,“refresh_interval”是同一Feed的两次抓取之间所需的时间间隔。

答案 1 :(得分:2)

基于新信息,我想我会做这样的事情:

让“第一个”客户端启动更新工作并使用它存储时间戳。 Everey将要求获取信息的其他客户获得兑现信息,直到该信息变旧为止。接下来从客户端点击将刷新cashe然后将被所有客户使用,直到下一次到旧。

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

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

答案 2 :(得分:0)

要做的最好的事情就是“很好”并且不会因为大量不必要的请求而超载Feed。我确定了一个1小时的更新时间,我的一个webapps监视大约150个博客的更新。我将他们上次检查的时间存储在数据库中,并使用它来决定何时更新它们。随机添加了这些Feed,因此它们不会同时更新。

答案 3 :(得分:0)

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

  1. 它是用twisted编写的,即使网络很慢也可以处理大量的并发。
  2. 它不需要任何cron jockeying或任何东西。
  3. 我实际上是因为我的基于cron的取件器成了问题。现在,我已将其配置为在互联网上获取我想要的随机内容,然后在更改内容时更改我自己网站的部分内容。