优化WP-Cache:Wordperss优化手册(2)
关键词:WP-Cache,Wordpress,优化,加速,Gzip
注:
♣ 本文是加速Wordpress-终极优化手册一文的补充,强烈建议您先参考终极优化手册后再看此文。
♣ 本文的方法只适用于单作者(不开放注册)的wordpress系统(但我相信目前绝大多数wordpress系统都是不开放注册的)。
加载WP-Cache插件是wordpress中最为常用的一种优化方式,同时,php程序本身也提供了一种非常强大的优化方式,也就是Gzip压缩传输。非常遗憾的是,WP-Cache插件要求关闭wordpress的内置gzip压缩功能。因此,我们要实现的就是在WP-Cache中使用Gzip的功能。这一思路的实现,我在终极优化手册中已经提到:
打开wp-cache-phase1.php,大概在35行左右找到如下代码:
foreach ($meta->headers as $header) {
header($header);
在此代码前添加下面的代码:
if ( extension_loaded('zlib') ) ob_start('ob_gzhandler');
OK,现在问题来了。
让我们深入分析一下加了Gzip功能的WP-Cache的工作原理:
首先,WP-Cache在用户第一次访问页面的时候,将生成的页面传输给用户,同时在服务器上缓存了页面,这第一次传输给用户的页面是没有用gzip方式压缩的。
第二,我们看wp-cache-phase1.php中的最后一个函数function wp_cache_get_cookies_values(),不难发现wp-cache是根据访问者的email来判断是否为同一用户的。问题就在WP-Cache的的这个判断机制上:
WP-Cache为不同的用户生成了不同的缓存页面。而这些用户第一次访问某一页面时候,WP-Cache发送的都是未经过Gzip压缩的页面。因此,除非这些用户再次访问该页面,否则他们都是享受不到Gzip压缩带来的好处的。
既然知道了问题的症结所在,解决的方法也就显而易见了。我们可以换用判断用户网址的办法来判断是否为同一用户,因为大多数用户都不会填写网址。这样用户A访问后,其他的BCDE等用户来访问,系统一般都会将用Gzip压缩过的页面传输给他,大大提高了缓存页面的利用率。但是这会产生一个新的问题:当用户A访问某一页面后,缓存页面中也就保留了他填写的用户名和email地址(comments.php中用php来读取缓存)。这个问题很好解决,我们可以用javascript来读取缓存。
现在要做的就是修改代码了:
在wp-cache-phase1.php文件中找到如下代码:
if (preg_match("/^wordpress|^comment_author_email_/", $key)) {
在前面加上//将其comment out,随后在该行的下一行添加如下代码:
if (preg_match("/^wordpress|^comment_author_url_/", $key)) {
接着,打开你的theme中的comments.php文件,找到填写comment的表单部分,这里以theme/default下的文件为例:
<input type="text" name="author" id="author" value="<?php echo $comment_author; ?>"
将其中的 value="<?php echo $comment_author; ?>"删除。并以此类推,删除表单中email和url的value项。
随后,我们在紧跟表单后的<?php endif; ?>之前添加如下的代码,用以读取用户的Cookies:
<script type="text/javascript">
//<![CDATA[
// Set cookies
var aCookie = document.cookie.split("; ");
function GetCookie(sName, id)
{
// cookies are separated by semicolons
var something = document.getElementById(id);
// set value to NULL for new visitors
something.value="";
if(!something) return 0;
for (var i=0; i < aCookie.length; i++)
{
// a name alue pair (a crumb) is separated by an equal sign
var aCrumb = aCookie[i].split("=");
if (sName == aCrumb[0])
{
//reading cookie value
something.value=unescape(aCrumb[1]);
return 1;
}
}
// a cookie with the requested name does not exist
return 0;
}
GetCookie("comment_author_8e11b42cc2f3a74aac664cc9afa5baf7", "author");
GetCookie("comment_author_email_8e11b42cc2f3a74aac664cc9afa5baf7", "email");
GetCookie("comment_author_url_8e11b42cc2f3a74aac664cc9afa5baf7", "url");
//]]>
</script>
请注意,其中的"comment_author_"中的长串字符为系统生成,请自行查找后替换。(我是用firefox的web developer插件看cookie的名字的)OK,把所有修改过的文件保存一下,上传,试试下效果吧。

At 2007.04.07 00:37, 正月初一 said:
写的好啊。
我试下
先顶!
[Reply]
At 2007.04.07 07:04, 正月初一 said:
做个友情链接好吗?
你的我已经做好了
谢谢。
[Reply]
At 2007.04.07 12:58, SUN said:
done

[Reply]
At 2007.04.10 09:50, 江南sky said:
好东西 先试试!
[Reply]
At 2007.04.17 08:40, king said:
GetCookie("comment_author_8e11b42cc2f3a74aac664cc9afa5baf7", "author");
那个字符串到底有什么用呀?
我应该这么改呢?
[Reply]
At 2007.04.17 09:32, SUN said:
本来php程序会从你的电脑中读取Cookie数据,这些数据主要包括留言者的信息资料。
但是WP-Cache生成的静态文件后,事实上是个html的静态文件,就没办法从你的电脑中读取Cookie数据了。
因此,你需要用java 程序来读取你电脑内 缓存。那个字符串是你的wordpress自动生成的,每个wordpress都会生成一个unique的字符串以示区别。你可以用firefox的web developer toolbar插件中的Cookies功能来看你的字符串是多少。
[Reply]
At 2007.05.05 16:48, lj2505 said:
[Reply]
At 2007.05.05 18:56, SUN said:
wordpress内置的Gzip功能是关闭着的
[Reply]
At 2007.06.11 21:50, king said:
测试长串~~
[Reply]
At 2007.07.20 07:20, 总而言之,统而言之 said:
Wordpress 插件: wp-cache 加速你的博客访问速度...
今天给大家介绍一个可以加快你的博客访问速度的 Wordpress 插件,WP-Cache。这个 WP-Cache 是一个页面缓存插件,也就是将你的 Wordpress 动态网页生成静态网页,以加快博客站点的访问速度。
......
[Reply]
At 2007.08.12 15:53, 日志茶小屋 » 优化WP-Cache said:
[...] 原文出自这里 [...]
[Reply]
At 2007.08.14 17:11, 优化WP-Cache said:
[...] 原文出自这里 [...]
[Reply]
At 2007.09.28 15:15, Beach said:
真的不错!
[Reply]
At 2007.10.28 18:41, www.lcok.net » Blog 存档 » Wordpress 插件: wp-cache 加速你的博客访问速度 said:
[...] 尽管 WP-Cache 可能会带来一些负面影响,但对于流量较大的博客而言,这个插件还是非常实用的。这里有个网友提出了一个关于 WP-Cache 优化的文章,主要是将如何使用 WP-Cache 的同时,使用 gzip 功能。另外,这里还有一位网友,介绍了如何在 Windows 主机下使用 WP-Cache ,如果你使用的是 Windows 主机,可以参考一下。 [...]
[Reply]