1

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

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

4

4 回答 4

3

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

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

于 2008-12-02T04:48:06.773 回答
2

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

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

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

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

于 2008-12-02T04:19:40.903 回答
0

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

于 2008-12-02T04:32:19.113 回答
0

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

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

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

于 2008-12-02T04:36:57.280 回答