- 您的位置: 网站制作 日志内容
WordPress性能优化实例
作者:admin 日期:2010/05/17
Wordpress以其强大的功能和丰富的扩展性,赢得了众多的使用者。但一直以来,Wordpress的低性能也是广大Wordpress郁闷的事。但是,或许因为大多数的Wordpress使用者是用来搭建小型个人博客,所以对性能也并不看重。
我使用Wordpress搭建了一个CMS网站,现在的文章数达到了3万,数据库达到了600M。此时,Wordpress的低性能体现出来了,极大地影响了我的网站访问。有人认为,尽量减少插件、使用简单的主题可以加快Wordpress的速度,但我认为,牺牲功能来换取性能,是不值得的。为此,我花了些时间对Wordpress作了优化,在保留足够的功能的前提下,尽量加快Wordpress的运行速度。
先说一下我的VPS服务器配置:
CPU:单核Intel(R) Xeon(R) CPU L5420 @ 2.50GHz(单核CPU运行Wodpress可真够吃力)
内存:256M
硬盘大小:对WP性能没影响,就不说了
控制面板:kloxo
服务器:CentOS 5.4 + Lighttpd
Wordpress的低性能体现在两方面:一是加载的文件、代码太多。下面具体说说针对这两方面的优化;一是数据库设计不合理,数据库查询次数太大;
针对Wordpress加载文件太多的优化,我在服务器上安装了eAccelerator缓存,把PHP文件都预先加载到内存里,再读取,就快多了。在服务器上安装eAccelerator的方法可参考这里 http://www.shareac.net/2010_05_102.html。
另外,在Wordpress前台,我去掉了语言包,我已经把中文都写到主题里了,所以前不几乎不需要语言包了。实践证明,去掉语言包,能省至少30%的页面执行时间!以wordpress 3.0 中文版为例,修改wp-settings.php文件,将第240-249行改成以下内容:
if( substr($_SERVER["REQUEST_URI"],0,4)==’/wp-’ ){
// Load the default text localization domain.
load_default_textdomain();// Find the blog locale.
$locale = get_locale();
$locale_file = WP_LANG_DIR . “/$locale.php”;
if ( is_readable( $locale_file ) )
require( $locale_file );
unset($locale_file);
}
这里有一个修改好的文件,大家可以直接使用,点击下载(2010-7-4更新)。
注意,仅仅是前台去掉了语言包,后台还是会加载语言包,还是可以显示中文的。
针对数据库的优化,大家首先想到的可能是使用DB Cache Reloaded插件或者Memcached缓存。但是这两个方法我都不用。我的网站放在一台只有256M内存的VPS上,再也没有多余的内存使用Memcached了。不知是什么原因,我在多台服务器上测试了Memcached,启用Memcached反面比没有启用Memcached,页面执行时间还要慢。另外,启用了mysql里的query_cache功能,这同样可以优化mysql查询。下面是我的my.cnf配置文件,大家可以参考,注意,仅适合于小内存的服务器,大内存的话就没必要这么节约了:
skip-locking
key_buffer_size = 16M
max_allowed_packet = 100M
sort_buffer_size = 512K
net_buffer_length = 8K
read_buffer_size = 256K
read_rnd_buffer_size = 512K
myisam_sort_buffer_size = 8M
table_cache = 80
query-cache-type = 1
query_cache_size = 16M
query_cache_limit = 3M
query_cache_min_res_unit = 2k
我对主题作了修改,使用“区块缓存”来减少数据库查询。Wordpress运行一个页面,头部、中间、侧边栏、底部,几乎都要读取数据库,而往往只有中间部分是每个页面不同的,其他部分都相同。例如对于日志页,如下图所示,1、2、4、5这几部分,在每篇日志里都是一样的,所以,可以把这几部分缓存起来,不用每次都查询数据库。
这里有我正在使用的一个eAccelerator缓存类,点击下载eAccelerator缓存类。下载后把里面的代码添加到主题的functions.php文件里,注意是添加,不是覆盖你的functions.php文件。下面举一些例子说明怎么缓存主题里的区块。
1、缓存侧边栏,定时刷新缓存
<?php $yscache = new yscache();?>
<?php if($yscache->beginCache(‘mySidebar’,array(‘duration’=>6000))) { ?>
这里放置侧边栏代码
<?php $yscache->endCache(); } ?>
上面的代码会将侧边栏缓存6000秒。其中“mySidebar”是这个区块是唯一key,不能和其他区块相同,array(‘duration’=>6000)表示刷新缓存的条件,这里是每6000秒刷新一次。
2、缓存首页中间部分,直到有新日志发表再刷新
<?php $yscache = new yscache();?>
<?php if($yscache->beginCache(‘myHome’,array(‘sql’=>’select max(ID) from wp_posts’))) { ?>
这里放置首页中间部分代码
<?php $yscache->endCache(); } ?>
上面的代码会将首页中间部分缓存起来。其中“myHome”是这个区块是唯一key,不能和其他区块相同,array(‘sql’=>’select max(ID) from wp_posts’)表示刷新缓存的条件,这里表示一直缓存,直到wp_posts表里最大ID有改变,也就是说,缓存到有新的日志发表,就会自动刷新缓存。
2、缓存首页中间部分,永不自动刷新,除非手工刷新缓存
<?php $yscache = new yscache();?>
<?php if($yscache->beginCache(‘myHome’) { ?>
这里放置首页中间部分代码
<?php $yscache->endCache(); } ?>
上面的代码会将首页中间部分缓存起来。其中“myHome”是这个区块是唯一key,不能和其他区块相同,没有刷新缓存的条件,这里表示缓存不会自动刷新,除非服务器重启,或者使用后台设置–>刷新eAccelerator缓存菜单来手工刷新缓存。
通过以上优化,日志页面的速度已经不错了,可是,分类页面速度还是很慢。这是因为分类页用了多个联合并且带有IN的SQL查询,效率本身就低,再加上我的服务器配置低,所以就很慢了。这也是因为Wordpress的数据库设计不合理,WP把日志的标题、正文全部存储在同一张表里了,我的wp_posts表就600M大小了,每次select *产生的数据量都很大。为此,我把wp_posts表里的日志正文独立出来,放在另一张表里。不存储正文,表的体积大大减小,大约只有原wp_posts表的二十分之一,查询就快了很多。这是我写的一个实现此功能的插件,不过还不完善,还没实现自动更新,每次添加日志后需要手工刷新这个表,点击这里下载。
在服务器优化方面,我使用lighttpd来代替庞大的apache,既节省内存,也让wordpress运行得更快。另外,开启了lighttpd的expires功能,把图片、JS、CSS等文件缓存在客户端的浏览器里,不用每次都从服务器下载这些文件。还有,启用gzip压缩功能,减少传输的页面文件大小。
在Kloxo里开启lighttpd的expires的方法:Clients–你的域名–Script–Lighttpd Rewrite Rule,里面添加:
$HTTP["url"] =~ “\.(jpg|gif|png|css|js)$” {
expire.url = ( “” => “access 7 days” )
}
好了,以上就是我的优化方法,大家可以访问我的网站,体验一下速度 www.zuowenba.com
PS: 感谢网友saiq指出错误。

文章来自:
Tags: 






感觉wordpress是先天的慢,现在喜欢用drupal,速度真不错
我修改了wp-settings.php文件后,发现调用日志归档时会报错
Fatal error: Call to a member function get_month() on a non-object in ../wp-includes/general-template.php on line 925
多谢你发现错误,请按新方法修改:
if( substr($_SERVER["REQUEST_URI"],0,4)==’/wp-’ ){// Load the default text localization domain.
load_default_textdomain();
// Find the blog locale.
$locale = get_locale();
$locale_file = WP_LANG_DIR . “/$locale.php”;
if ( is_readable( $locale_file ) )
require( $locale_file );
unset($locale_file);
}
那个使用区块缓存,我在侧边栏测试时是把[?php $yscache = new yscache();?[
[php if($yscache->beginCache(‘mySidebar’,array(‘duration’=>6000))) { ?[放在sidebar.php,但老是出现错误,说那个new yscache没找到
你把eAccelerator缓存类加到functions.php里了吗?
加了,第一件事就是加那个,然后才在侧边栏把那个加上去
我也不清楚是什么原因,要不,把你的主题发给我,我测试一下。
我用cos-html-cache生成静态页面,会不会有帮助呢
会很快