我正在开发一个必须获取用户Feed的网站。但是,如果我有一个数据库,比方说300个提要,我怎样才能最好地优化提取。我要设置一个获取提要的cron-job,但是我应该每隔一分钟做一次这样的事情吗?
关于如何在PHP中实现这一目标的最佳方法?
答案 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为我做这件事。它很小,但有几个非常重要的方面:
我实际上是因为我的基于cron的取件器成了问题。现在,我已将其配置为在互联网上获取我想要的随机内容,然后在更改内容时更改我自己网站的部分内容。