欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

让drupal飞起来的性能总结——开发完博济站后的小总结

shiping1 的头像

让drupal飞起来的性能总结——开发完博济站后的小总结

January 21st, 2011 by 黎 浩江 Leave a reply »

drupal的确很强大,不过新手总是因为drupal慢而找不到很好的解决办法而却步了。

这里写下一些你不能在网上找到的,特别是数据库优化部分——数据库结构建立才能从根本上让你的drupal站快起来。

下面适合drupal5~7.

http://www.bojistudio.org是一个内网的电影站,大约有30000部电影+电视等,还有100000条新闻,字段大约有几 十个,还有些计数统计什么的,主要的数据分布在8个表中。访问量大约是100~2000个用户每分(IP是内网的,没说出来的价值),它的页面有点像 www.verycd.com,事实上,开发的时候美工就是按verycd来做的

访问量大约是http://bbs.bojistudio.org(外网的论坛)的10倍吧。

 

1.最优的架构是:linux+apache(或 ngnix)+MYSQL+PHP+EACC(加速器):一开始我用的是WINDOWS的架构,结果发现装了加速器后双CPU四核的机器很快CPU就爆 了。改用linux后load ava一般在2以下。如果你想用drupal做大访问量的站,别考虑太多了,不要用windows,用linux吧。经验之谈:linux不用加速器也比 win下用加速器要快,无论是win+iis还是win+apache(或ngnix)。你也许会不信,然后在网上浪费一堆时间看一些对比linux和 windows的文章(我也这么干过)。

2.我的站是使用了boost这个模块的,静态生成,太必须了。不过 我只用了此模块帮我静态生成,我取消了此模块中使用cron去清空静态页面的功能,而是自己另外写了几行代码,按需清空内容。列表页是天天都要清空重建 的,不多,只有几十个,但文章页有几十万,总不能浪费性能天天重新生成,所以我自己写了几个清空的条件。当然,如果你的站没用boost静态生成,那这点 略过。

3.VIEWS,如果你用views的时候,并没有使用过hook_views_data自 己去改写几行代码,别想了,views一定慢,而且会慢死,凡是调用views的页面都会不同程序的慢。原因在于views查询数据库的时候,使用的是 left join。如果你用了CCK字段,则要查出文章的内容,则drupal至少要left join两次……所以,我在设计CCK字段的时候,往往是宁愿数据冗余也尽量将字段安排在一个表上的。这样就会使views left join更少,速度更快。而且我会用hook_nodeapi复制title 和 body为CCK的字段,然后再用hook_views_data去写几行代码,使得views查询的时候,只在一个表上查,这样views就快多了。这很dirty,但站点速度会很快。不过,现在我很少用这种办法了,因为我越来越少用views了。此法能令大量用views的站快很多.

4.创建MYSQL临时表,这才是我想推荐用的的办法。

例子:我的列表页生成的时候,需要从node表中取得标题、修改时间,从node_revisions表里取得body,从分类表中取得分类名字, 从content_type_news里取得几个字段的信息,从downloadlinks表中取得下载连接的个数,从统计表里取得这周此文章被浏览的此 数。一共六个表(事实上我看了下我的代码,查了9个表),如果用views做,也能做到。但你要考虑一种情况,你的列表页的访问频率是大得惊人的,即便用 上了drupal的cache,boost,cache router模块,这里的查询也是很吓人的,特别是参数特别多,没法全部静态生成的时候。大约你做完一次查询要0.1s,这是很吓人的的,一般来说,在一 个表中取得数据,只需要0.001s。

我的解决办法就是将这几个表,用一个代码合并在一个临时表中,这个临时表每4小时(按需要)更新一次,这样就能使每次查询N个表变为每次查询1个表。

当然,说得简单,做的时候就要用到MYSQL的语句:

CREATE  TABLE  ”.$tempname.”  DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci   as    ( SELECT …………………………)

当然了,用到这个优化方法,你得有些准备知识:会建模块,会用hook,会drupal的database layer就是db_fetch_object等几个API了。

我现在特别喜欢这个方法,有了这个方法后,还配合hook_views_data,既能使网站飞起来,又能用到views的优点,所付出的代价也就是建个新模块写那么几行SQL而已。

5.用drupal做站,如果你的打算是像用国内CMS一样零代码的话,别想了,是不可能的,出来混,总是要写模块写代码的。所以就要用到cache api

6.明白:drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL)  与 drupal_bootstrap(DRUPAL_BOOTSTRAP_DATABASE) 的差别吧,区体不说了,DRUPAL_BOOTSTRAP_DATABASE是好东西,如果不明白,赶紧查GOOGLE

上面的几个办法总结盟在我的博客中的其它文章上应该有详细的文章总结(偶尔还是喜欢写写总结),http://www.trackself.com,欢迎交流。

来自 http://www.trackself.com/archives/1340.html

普通分类: