WordPress优化技巧

1,插件优化之——插件按需加载

对于安装的插件,并不是每个插件在每个页面都要加载的。
总的原则就是:
只在后台使用的插件绝不在前台加载。由于wp在初始化时会载入plugins目录下面的已激活插件和载入主题目录下面的functions.php文件,因此,在插件的“主”文件中,我们可以做些判断,如对于只需要在后台使用的插件,可用如下PHP代码包裹之:

1
2
3
4
5
if( is_admin() )
{
//原插件loader内容...
//这里可能包含很多代码,特别是有些插件,往往包含很多include和require语句。
}

这里我说的“主”文件,也就是loader,是有Plugin Name/Plugin URI/Description/Version 等WP标准插件注释信息的PHP文件。
有些插件不管3721,每个页面都给加载js或者CSS,其实如果用不着在某些地方加载的话,可以修改一下它,这样WP跑起来负担小多了。

2,插件按需启用/禁用

有些插件是只需隔一段时间使用一次的,如Optimize DB这个用于优化mysql数据库的插件,只需要隔一两个月使用一次即可,并不需要24小时开着。

3,尽量减少MySQL查询次数

MySQL查询是PHP代码中比较慢的部分,查询的增加,意味着运行效率的降低。
例如,存档插件,一般如果没有新文章发表,存档的内容应该是不变的,这种东西就没必要每次用户访问时都查询,可以通过add_option来将它保存在数据库中或者用文件缓存将它保存在文件中,载入页面时再取出即可。在新增日志的上挂上动作,使之更新缓存即可。
典型的例子就是我现在用的“存档”页面和我以前用的主题green the web news 的“顶部页面、菜单”和“侧边栏友情链接”,因为这些东西基本上是静态的,因此,完全可以缓存起来。
主题中的widget,尽量不要用wp自身的WP_Query来查询,那个很费时的。一般情况下使用原生的SQL语句效率最高。如友情链接、热门文章等,一般更新很少的,都可以缓存起来。
还有就是,可以使用wp自带的内存缓存系统WP_Cache ,如我之前的green the web news主题中sidebar的一个widget中的代码:

1
2
3
4
5
6
7
8
9
if(! ($comments =wp_cache_get('comments',  'ihacklog-sidebar'  ) ) )
{
//干活,从数据库中取出东东
//添加到缓存
wp_cache_set( 'comments', $comments , 'ihacklog-sidebar' , 3600);
}
foreach ($comments as $comment) {
//显示
}

还有一个办法就是:静态化
可以使用如Hyper Cache之类的静态化插件,这样站点跑起来肯定快,静态内容嘛,基本没有多少查询的。

4,压缩合并js和CSS,按需加载

按照YSlow的建议,js尽量在footer加载,CSS尽量在Header加载。
前面我已经写过一篇关于按需加载js和CSS的文章了。(《在wordpress中按需加载JavaScript和CSS》)

不管是主题还是插件,都可以优化的。
js和CSS可以采用gzip压缩后再发送。在gzip压缩之前,我们可以先用工具压缩一下代码。
js压缩推荐采用dean edwards’s js packer
CSS压缩推荐采用Yuicompressor.jar (因CSS tidy不适合处理包含CSS3属性的CSS code)

目前最新版的是yuicompressor-2.4.6.jar ,可到这里下载。
或者直接到YUI Compressor Online在线压缩。

使用方法:

1
java -jar yuicompressor-2.4.6.jar --type css --charset UTF-8 -v -o 输出文件名 要压缩的原文件名

不单单是js和css,html页面也可gzip压缩后再传送,可以用GZIP Output这个插件来使wp压缩页面后再发送。

要测试你的站点是否启用了gzip压缩,可以到GIDZipTest这个页面检测。

还有就是你可以合并CSS和js,这些要合并的东东,通常是在每个页面都需要的。
合并js或css的好处是可以减少http请求数量,这也是YSlow的建议里面中的一条。
这里推荐一个插件:WP Minify,此插件可以将你的js和css文件合并为一个文件后再发送给浏览器。从一次程度上减少了HTTP请求数量。还有一个功能类似的插件,叫“PHP Speedy”。

对于静态的文件,php是无能为力了,可以靠web服务器,如apache来gzip压缩后再发送。
apache需要启用了mod_gzip模块(LoadModule gzip_module modules/mod_gzip.so),以下指令才会生效:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<IfModule mod_gzip.c>
mod_gzip_on Yes
mod_gzip_minimum_file_size 1000
mod_gzip_maximum_file_size 300000
mod_gzip_item_include file \.htm$
mod_gzip_item_include file \.html$
mod_gzip_item_include file \.php$
mod_gzip_item_include file \.php3$
mod_gzip_item_include mime text/.*
mod_gzip_item_include mime httpd/unix-directory
# mod_gzip的临时工作目录: mkdir /tmp/mod_gzip; chmod -R 777 mod_gzip
mod_gzip_temp_dir /tmp/mod_gzip
mod_gzip_dechunk Yes
mod_gzip_keep_workfiles No
</IfModule>

服务器管理员要注意:
mod_gzip和mod_php的配合:不要让mod_gzip和mod_php使用同一个临时目录,php_session存放目录可以通过 php.ini设置到

1
session.save_path = /tmp/php_sess

5.向浏览器发送超时信息和Etag

HTTP的Expires headers是个很有用处的东东。
通过可以通过http服务器或者PHP来发送这些信息.
如可以通过修改.htaccess文件,增加如下指令来设置这个:

1
2
3
4
5
6
7
8
#ETags
FileETag MTime Size
<ifmodule mod_expires.c>
  <filesmatch "\.(jpg|gif|png|css|js)$">
       ExpiresActive on
       ExpiresDefault "access plus 1 month"
   </filesmatch>
</ifmodule>

这要求apache服务器启用了mod_expires模块,关于FileETag指令,可到这里查看文档。

对于通过php方式发送的东东,如javascript 和css,可以通过PHP来发送这些信息:

1
2
3
4
5
6
7
8
9
<?php
 $last_modified_time = filemtime(__FILE__);
 $etag = md5_file(__FILE__);
 header("Etag: $etag");
 header("Cache-Control: must-revalidate");
 $offset = 60 * 60 * 24 * 3;
 $ExpStr = "Expires: " . gmdate("D, d M Y H:i:s", time() + $offset) . " GMT";
 header($ExpStr);
?>

关于缓存控制header(Cache-Control HTTP Headers)参数的解释:

max-age=[seconds] 与Expire类似,不过这个是相对于请求时间的,而Expire是设置一个超时的绝对时间。

设置缓存后,第一次访问页面时某个CSS的获取情况:

可以看到首次访问获取的数据是25.88 KB,耗时0.87s ,HTTP状态码是200 .

第二至第N次访问页面时CSS的获取情况:

从图中可看出其后访问获取的数据是 250 B,耗时 437 ms , HTTP状态码是304.

6,缓存gravatar

这个对于国内用户来说基本是必须的。因为处在强大的GxxFooW的之内的局域网淫民,访问gravatar服务器速度慢不说,偶尔抽风的导致gravatar头像获取不到的话,会严重影响网页的加载速度的,特别是页面中头像比较多的时候。
缓存头像可以用一个名为 GRAVATAR CACHE 的小程序(见这篇文章),或者用Hacklog Gravatar Cache或其它头像缓存插件,只要你愿意。

7,方便用页面模板搞定的绝不用插件

关于使用插件与使用页面模板的效率问题,我以前写过一篇文章《关于免插件的一点小想法(效率问题)》,插件基本上是每访问一个页面就要加载一次的,而页面模板却不同。
只有当你访问到使用了特定模板的特定页面时,才会加载该模板并执行其中的代码,因此,从某种程序上来说,使用页面模板是高效的,不过它在一定程序上失去了插件的便捷性。如我的存档页面、留言板等都是用的页面模板实现的。

更多
7 Responses Post a comment
  1. 荒野无灯

    @老Z
    网站在线检测也不可全信,你上面说的两个相反的结果,肯定有一个网站的检测结果是错误的。这里有一篇介绍手动检测的方法的文章:http://ihacklog.com/?p=4942

  2. 老Z

    为什么用博主给的地址检测GZIP未开启,用站长之家显示是开启的呢?

  3. 程路

    受教受教,感谢博主,把自己的博客也优化一下,哈哈……

  4. Demon

    WP是要好好的优化一下。 :roll:

Leave a Reply

Note: You may use basic HTML in your comments. Your email address will not be published.

Subscribe to this comment feed via RSS