Apr 6, 2007

优化WP-Cache:Wordperss优化手册(2)

关键词:WP-CacheWordpress优化加速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,把所有修改过的文件保存一下,上传,试试下效果吧。

Tags:     
Post by SUN @ 10:53 pm | 与时俱进 | Comments (14) | Add to del.icio.us | Digg This!
  • 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
      :P

      [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:

    :?: 这样的话,还要不要开启GZIP呢?

    [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:

    :mrgreen:
    真的不错!

    [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]      

(Required)
(Required, will not be published)