笔记 by 车东

Lilina的简单预缓存加速

· 应用安装|AppInstall

何东也安装了一个Lilina:Info-Aggr for Hedong,他觉得太慢。

如何加速呢:Lilina的RSS更新是一种动态触发的缓存更新机制,当每次有用户访问请求的时候,lilina检查cache目录中相应RSS的缓存,如果没有缓存或者缓存过期了,就立刻去服务器上取。而慢一般就慢在这个RSS的同步上了,比如:每天早上第一次访问,所有的RSS都需要更新,而订阅的RSS又非常多的情况下速度就非常慢了。 减少每次访问时触发RSS更新的几率是提高速度的关键。

我的方法: 1 使用wget导出成静态页面或者按照一定时间强制RSS更新 我在crontab中增加了:

chedong’s homepage

*/10 * * * * (/usr/bin/wget -O - http://www.chedong.com/) 这样后台就能每10分钟去取一次RSS结果页,这样:一般用户看到的时候可以大大降低没有命中缓存的情况。“wget -O -“表示输出到标准输出,完全可以改成 wget -O /home/path/to/lilina/index.html 这样用户就直接访问导出的index.html了,和PlanetPlanet效果一样。

2 将缓存时间设置为4个小时过期(缺省为1个小时):这样每次访问的时候同时又多个RSS同时过期的几率就会小很多。

具体做法是在Lilina的输出脚本中增加’MAGPIE_CACHE_AGE’全局变量: 单位是秒 缺省是3600秒 比如要改成4小时 define(‘MAGPIE_CACHE_AGE’, 60 * 60 * 4);

其实大部分BLOG每周只有少量更新,达到4个小时的同步延迟速度已经足够了(Google的新闻的更新周期才3个小时)。

3 控制你的RSS数据源个数: 如果RSS有上百个,Lilina每次都要检查上百个的缓存文件,所以即使缓存文件都是最新的,检查过程也会非常漫长。我个人觉得控制在RSS在20个以下比较好,建议经常删除一些你不关心的或者更新很慢的BLOG。

4 客户端浏览器本地缓存: 在lilina输出程序的开头增加以下Header: // always modified now header(“Last-Modified: " . gmdate(“D, d M Y H:i:s”) . " GMT”); // Expires one hour later header(“Expires: " .gmdate (“D, d M Y H:i:s”, time() + 3600). " GMT”);

告诉浏览器:这个网页1个小时后才过期,一个小时内不要再向服务器发送请求,这样如果一个用户在一个小时内多次访问的话,也不会向服务器发送多个请求了(直接利用浏览器本地的缓存)。关于客户端缓存和服务器端缓存机制,可以进一步参考一下缓存设计一文。

主动缓存和被动缓存: 你使用Planet也会发现,Planet是采用的主动缓存触发的机制:一个后台的程序每隔几分钟(由你自己设置crontab)主动去同步RSS并导出成静态页面。

其实Lilina把RSS输入/输出的逻辑已经做的很好了,如何加速这个程序:完全是你自己的缓存设计的问题。

如何对比Lilina和其他客户端工具呢: 其实我使用lilina就是为了帮助我关心的内容能被更多人看到,所以Lilina是一个发布共享工具。如果你不需要共享的话,当然完全可以使用自己的客户端工具。

你完全可以将LILINA订阅的RSS再烧制成另外一个聚合后的RSS: 这不就是你自己的个人FeedBurner吗?

2005-05-08 终于无法忍受首页的速度:完全无法达到8秒定律的要求,于是将lilina.php用wget在crontab中定期成生成了一个静态页面:

hourly lilina dump

1 * * * * (/usr/bin/wget -O /home/apache/chedong.com/www/lilina.html http://www.chedong.com/lilina.php)

哈,符合2秒定律了。

2005-05-09 网站一周记:我也有自己的网摘了,RSS每天自动DUMP生成的。 以前的RSS订阅一直是流水帐:只在首页显示最新一周的内容。忽然觉得这些内容还是很有价值的,于是做了了一个归档工具,每天用WGET将RSS内容归档到 Yesterday Digest@CheDong.com目录下,每天一个。

2005-11-10 修正了MAGPIE_CACHE_AGE和MAGPIE_FETCH_TIME_OUT的理解错误 // remote fetch time out after 10 seconds define(‘MAGPIE_FETCH_TIME_OUT’, 10); // cache expire in 3 hours define(‘MAGPIE_CACHE_AGE’, 60 * 60 * 3);

💬 历史评论

以下 6 条评论从旧版 Movable Type 博客迁移而来。 原始评论时间:2002–2016 年。

wewe · 2005-04-15 01:17

谢谢车兄,让我重新有了使用这个软件的勇气。刚刚安装上新版,但有个小问题,我在调用edit.php时,出现的错误提示是:Fatal error: session_start(): Failed to initialize storage module: user (path: /usr/local/ses) in /usr/local/www/blog/muchmusic/mp3/inc/sessionauth.php on line 9 服务器不是我的,我对这些都是新手,车兄能帮我判断一下问题出在什么地方吗?该怎么解决?


tristones · 2005-04-15 12:02

谢谢车兄提供的好问,思路清晰了很多。开始直接把php放在crontab执行,就遇到权限问题。用了wget就没有问题了。


kiral · 2005-04-20 20:30

呵呵,我是直接把php放在crontab执行,15分钟一次,然后把index.php的加’MAGPIE_FETCH_TIME_OUT’设成一个月过期,浏览速度还好。


hzqbbc · 2005-05-11 13:39

今天刚设计了另一个cache的方法:生成静态页面,可以避免使用header强迫浏览器cache页面,或虚拟主机用户没权限使用cron的问题。

文章地址: http://www.hzqbbc.com/blog/arch/2005/05/aersselilinaceh.html

但是需要改动lilina的程序。跑了几个小时,感觉还行。


BunnyQ · 2005-05-26 14:07

hehe 我的lilina也是用crontab定时wget的 一直是访问html文件 非常快的说


幽灵多啦 · 2005-08-20 16:22

2 将缓存时间设置为4个小时过期(缺省为1个小时):这样每次访问的时候同时又多个RSS同时过期的几率就会小很多。

具体做法是在Lilina的输出脚本中增加’MAGPIE_FETCH_TIME_OUT’全局变量:单位是秒 define(‘MAGPIE_FETCH_TIME_OUT’, 60 * 60 * 4);

这个做法是错的,应该在conf.php中修改MAGPIE_CACHE_AGE常量。