我现在正在一个必须获取用户提要的网站上工作。但是,如果我有一个包含 300 个提要的数据库,我如何才能最好地优化获取。我将设置一个 cron-job 来获取提要,但我应该像每秒钟 5 次那样做吗?
关于如何在 PHP 中以最佳方式做到这一点的任何想法?
如果我理解您的问题,您基本上是在提要聚合器网站上工作?
您可以执行以下操作;首先每 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”是两次获取同一提要之间的所需时间间隔。
根据新信息,我想我会做这样的事情:
让“第一个”客户端启动更新工作并用它存储时间戳。其他要求提供信息的客户都会获得兑现的信息,直到该信息过时为止。然后,来自客户端的下一次命中将刷新所有客户端将使用的现金,直到下一次它变旧。
实际启动更新工作的客户端不必等待它完成,只需提供旧的兑现版本并继续执行直到工作完成。
这样,如果没有客户请求,您就不必更新任何内容。
最好的办法是保持“友善”,不要因为大量不必要的请求而使提要过载。我为我的一个 Web 应用程序确定了 1 小时的更新时间,该应用程序监视大约 150 个博客的更新。我将上次检查它们的时间存储在数据库中,并使用它来决定何时更新它们。提要是随机添加的,因此它们不会同时更新。
我写了pfetch来为我做这件事。它很小,但有几个非常重要的方面:
实际上,我之所以写它是因为我的基于 cron 的 fetcher 正在成为一个问题。现在我将它配置为在互联网上获取一些我想要的随机内容,然后在事情发生变化时运行脚本来更新我自己网站的某些部分。