浅谈数据调用——如何让比酷不再拖累你的首页
2008 10 25 05:15 PM 2954次查看
1.模块调用、内部调用和外部调用:
自定义类型的数据调用可以使用这种方式进行模块调用(自创的名词,官方好像没说这叫什么):
[module]唯一标识[/module]
模板文件内可以用这种方式进行内部调用:{eval request('唯一标识');}
其他文件只能用这种方式进行外部调用,且必须在设置中启用外部调用:<script type="text/javascript" src="论坛的URL/api/javascript.php?key=唯一标识"></script>
如果是论坛内部文件,可以用下面的方式:
<script type="text/javascript" src="api/javascript.php?key=唯一标识"></script>
2.主题列表类型中的{subject}只能以模块调用或内部调用方式显示,外部调用则不可见或出现javascript错误。这就是为什么很多人所比酷首页没法显示的原因。(如果无法预览的话,基本上就不能外部调用,包括在javascript中用特殊方法使用内部调用。)我在这帖给出了替代性的解决办法:《将比酷首页插件放在广告内》
虽然还不能完美模拟,但至少可用了。
现在我论坛的比酷首页的「最新回复」就能定位到最后一个回帖了,而不是{subject}默认的定位到楼主的帖。
此外,会员排行中的{avatar}也没法预览,应该也不能外部调用,可以用{avatarsmall}和{avatarbig}代替。
3.数据缓存时间的设置。很多人说首页打开很慢,数据库查询要1秒多,而且也设置了缓存;如果不是你的数据库问题,我只能说是设置得有问题。
你可以打开我的论坛首页,在大多数的时间数据库查询时间都很少,基本都是在0.05秒以内,我测试了几次,列在下面:
第一次进主页:我是将比酷N格修改了下,相当于10格,取主题时还把详细信息都取出来了。如果你用的4格、8格还比我慢,就按下面的方法找找原因吧。
Processed in 0.053025 second(s), 20 queries, Gzip enabled.
刷新一下:
Processed in 0.039697 second(s), 11 queries, Gzip enabled.
再刷新一下:
Processed in 0.031972 second(s), 5 queries, Gzip enabled.
在后台把缓存时间设为0,再访问首页:
Processed in 0.055139 second(s), 24 queries, Gzip enabled.
先明确一点,数据缓存时间是有依赖性的,例如:
假设你在首页调用了「比酷系列」这个模块,而「比酷系列」这个模块调用了「最新帖子」这个模块,你认为「最新帖子」的更新频率是多久?
答案是「比酷系列」的缓存时间。而默认情况下,「比酷系列」的数据缓存时间是5秒!
所以如果想减少数据库查询时间,必须把「比酷系列」的缓存时间设大点。
然后就研究下各个模块所需的缓存时间了,这个要根据你的论坛发帖频率来设置。
你可以查看自己论坛统计,找到“平均每日新增帖子数”这项,例如我的论坛当前是30左右。
再把30除以一天的小时数(如果凌晨基本没人发帖的话,可以把那段时间也扣除)。假设我的论坛从0:00到8:00都没人发帖,那么30÷(24-8)≈2,也就是每半时大概发1帖。
那么,如果你将「最新帖子」的缓存时间设为1800秒(30分钟),在每次更新缓存前,你的比酷首页平均也就只会漏掉1帖。而且这还只是每次都发主题的情况,如果是回帖的话,漏掉的几率更低。主题与回帖的比例也可以在论坛统计中看到(即平均每个主题被回复次数),我的大概是1:5,也就是30分钟新增的1篇帖子,只有1/5的概率是发表新主题,所以缓存设为1800×5=9000秒都行;只是作者可能不高兴2个多小时才在首页显示自己的新帖,适当弄少点也行,毕竟人不是机器。
再看看我每天必去的一个较大的论坛吧,名称就不说了,在Alexa上查到的本周日均IP约为100,论坛平均每日新增帖子数为207,平均每个主题被回复次数约为20,算起来60×60×24÷207≈417秒新增一个帖,8000多秒新增一个主题,缓存也能设很高。
如果你的论坛发帖太频繁怎么办?再看看我每天必去的一个大论坛吧,在Alexa上查到的当前排名是50000多,本周日均IP约为15000,论坛昨日新增1300多帖。能达到这个水平的论坛应该不多了,计算下来,缓存时间只有60多秒,即使是只算主题也只有几百秒,但是我访问它的首页,数据库查询只用了0.02秒。原因就是这种规模的网站,数据库服务器性能肯定很强;而为了避免不和谐内容的出现,所有主题都要版主人工审核,更新频率也就不用太快了;此外,采用的是文字4格,避免检索太多信息。
其实如果1小时内新增主题数超过10帖,你就该考虑10个新主题是否够用了。为你的热门版块单独弄个排名,是个更不错的方式(例如我浏览论坛时,基本只关注2、3个版块)。
其他基本上也能按上述方法设置,例如回帖也不用设置太频繁,因为大多数人关注的是新主题;精华主题和置顶主题基本上很少更新。
再说说图片调用吧,发有图的帖子频率一般比较低,这个你也能自己计算一下。重点是调用的数目不要太多(一般5~6个足够了,除非你的论坛就是关于图像的),查询这个很费时间,因为排序用到的字段多。
此外,如果你采用了天气预报,有时打开会很慢,有时甚至可能达到5秒,我去掉这个后,打开基本上没超过1秒。稍微看了下代码,这个获取的是腾讯的数据,而且访问了至少2次,所以自然会慢。如果不太需要的话,强烈建议删去,或者做个延迟、异步调用,访问量很大的论坛更是要注意这点。只是我还是ajax新手,所以不知道怎么弄成异步的,延迟这一小段代码也没啥用。
PS:延迟调用可以参考这篇帖:《利用Javascript实现较慢代码的延迟加载》。
最后,按照上面的方式设置一下你的缓存时间,再去访问下首页试试吧(第一次要重建缓存,你可以多访问几次试试)。
0条评论 你不来一发么↓