启用WP Super Cache纯代码版本之后的一些优化措施

张戈博客在上个月28号启用了WP Super Cache代码版,几天下来,虽然小问题不断,但是总体感觉非常不错!不管是前台还是后台,速度都有质的提升,着实值得会折腾的人使用。

感兴趣的可以先看下28号的具体教程:《WP Super Cache静态缓存插件纯代码版(兼容多域名网站)》.

下面,简单的说一下启用此功能后遇到的一些问题的解决办法或细项优化。

①、发表评论时并未删除缓存,导致无法显示最新评论;

②、若主题有登陆状态显示,那缓存之后,无论谁打开都显示已登录;

③、WordPress原生评论框已登录状态将带入缓存当中,效果同上;

④、管理员回复评论也会发送邮件给管理员(①、②项处理OK之后发现的问题);

⑤、无法保存评论者信息,这个是开启缓存之后的诟病,之前已分享过变相解决办法。

以上问题上一篇文章已有具体说明,下面是最新发现的问题:

⑥、居然会缓存评论填表信息;

⑦、缓存清理不够方便;

⑧、缓存没有时间戳;

⑨、发布/更新文章未删除缓存,导致无法显示最新内容;

⑩、开启缓存之后,首页加上index.php后缀仍然可以访问,从而造成收录重复;

⑾、会缓存不存在的页面(404),可能被搜索引擎抓取造成SEO影响(缓存之后会是200状态);

⑿、带补充

一、过滤用户信息

针对第⑥条:

今天,用浏览器无痕模式打开留言板意外发现如图尴尬:

启用WP Super Cache纯代码版本之后的一些优化措施

之前浏览器一直是有cookies,所以每次打开时,博客的js都会自动加载已保存的信息,也就是我的经常用的信息。今天鬼使神差的试了下无痕模式,才发现了这个BUG,尼玛把其他人填写的信息都给缓存了,这是泄漏他人隐私啊!而且也对新用户体验很差!

仔细看了下缓存代码,懒得深究为何会缓存用户浏览器的内容,直接在cache.php中加入了置空机制,搞定这个问题:

使用方法:编辑上一篇文章中所说的cache.php文件,搜索function auto_cache()函数,并替换为以上代码即可。

代码原理:就是在缓存内容之前,先将已保存的用户信息置空,这样处理之后,缓存到磁盘里的html文件才是纯净无痕的。

替换机制也很简单,就是借用了php的正则替换函数:preg_replace(),其语法如下:

比如,需要将hello word! 替换为 hello zhangge!,则可以这样写:

因此,我需要置空缓存内容中的用户名、邮箱及网址,也就是一个最简单的正则匹配过程,比如替换用户名:

所以,如果你在使用代码版的缓存功能之后,发现某些内容被意外缓存了,只要使用这个方法替换掉即可。

二、前台缓存清理

针对第⑦条

清理缓存不方便的问题,我今天写了一个js+ajax+php的方法,可以在前台ajax删除缓存内容:

①、新增JS+ajax 代码:

将以上代码添加到主题footer或合并到其他js当中均可,需要注意的是,在此代码之前必须先正常载入Jquery。

②、新增php代码:

将以上代码添加到静态缓存文件cache.php的<?php 之后即可。

注意:cache.php和js代码中的url对象是 一 一对应的!!这篇文章主要是针对上一篇文章而写的,所以就是cache.php,如果想改成其他php文件,也是可以的,但前提条件是和js中url对象要一致!

③、新增触发按钮

在文章、单页页面,合适的位置新增一个按钮或超链接,然后将其id改为clean即可实现点击该按钮时清理当前页面缓存,比如张戈博客将一个图片链接放到了百度分享工具条上(实现全局清理后,我将其移动到了右下角滚动条):

启用WP Super Cache纯代码版本之后的一些优化措施

最简单的写法如下:

你也可以在其他空闲元素上新增一个id="clean",总之就是要新增一个id为clean的元素!在网站前台点击这个元素将清除当前页面的缓存。

三、加入缓存时间

针对第⑧条:

如果缓存页面没有时间戳,会让人分不清楚这个缓存页面是什么时候生成的,因为有时删除了缓存文件,在前台刷新看到的依然是缓存内容(nginx通常会产生一个304的浏览器缓存)!如果有个时间戳,就能更加容易的区分是否是最新的缓存。

解决方法很简单,在缓存时在代码最后新增时间戳即可,和WP Super Cache一样!

和上文第一条过滤用户信息的操作一样,找到auto_cache函数,如下新增2行时间戳代码即可:

四、发布时删除缓存

针对第⑨条:

这个问题其实很好解决,只要使用WordPress钩子在发布或更新文章时,调用删除缓存函数即可,具体如下:

将以上代码添加到主题目录的functions.php中即可实现发布或更新文章(单页面)的时候,删除当前文章(页面)、首页及所在分类的缓存文件,比WP Super Cache的那个发布文章删除所有缓存的机制合理多了!!

Ps:关于删除缓存的所有代码中(包括前面的ajax清理功能),若存在二级分类,那么分类缓存路径可能需要进一步修改一下,才会更准确,如果你不清楚,那么用上面的代码也没有任何问题!

以下是张戈博客分类缓存路径的改进案例,仅供参考:

五、index.php跳转

针对第⑩条

今天,在看百度收录的时候,突然看到如下情形:

启用WP Super Cache纯代码版本之后的一些优化措施

试了下,没开启缓存的博客在首页后面加上index.php访问,是会自动跳到不带index.php的,即访问http://yourdomain.com/index.php 会自动跳到 http://yourdomain.com/。

但是开启这个代码缓存之后,带上index.php是不会跳转的,我估计wp super cache的缓存也有这个问题。好吧,说下解决办法:

①、最简单的方法:

直接在robots.txt里面禁止百度抓取即可(不过不怎么绝对!):

Disallow: /index.php

Ps:实际上,我的robots.txt里面本来就有一条:

Disallow: /*.php$

尼玛百度就是这么任性!!!不遵守协议。

②、301跳转方法:

试了半天nginx,发现和之前写的规则存在冲突,无奈之下只好用php代码实现301跳转:

将以上代码添加到cache.php的<?php之后即可,当然也可以放到网站根目录的index.php的<?php后面。

如图所示:

启用WP Super Cache纯代码版本之后的一些优化措施

保存之后,在访问带index.php的首页就能自动跳转到不带index.php,从而解决了这个困惑。

六、禁止缓存404

针对第⑾条

当有人有意无意的访问到一些不存在的页面地址时,缓存代码会将404页面给缓存成html。网络上经常有一些恶意扫描软件,对网站进行猜测抓取,进入缓存文件夹可以看到各种奇葩文件夹:

启用WP Super Cache纯代码版本之后的一些优化措施

先不说这样的文件夹会不会逼死强迫症。一旦这些奇葩路径被缓存,那么再次被访问,返回的就不再是404状态了,而是正常的200状态!

典型案例:明明是一个404错误,因为被缓存了,就被百度给收录了:

启用WP Super Cache纯代码版本之后的一些优化措施 启用WP Super Cache纯代码版本之后的一些优化措施

很简单的处理办法:

①、打开主题目录下的404.php模板(国产主题大部分有),然后在任意位置插入<!-- 404nocache -->;

②、编辑缓存代码,在auto_cache函数里面插入如下代码:

这样处理一下,就完美解决了会缓存404不存在页面的问题了!


 

好了,目前就发现了这几个问题,也一 一解决了,我自己回顾了一下,发现这代码版几乎已经实现了WP Super Cache的绝大部分功能,甚至更好!!有时间,我会尝试将其整理开发成比cos-html-cache、wp super cache更优秀的缓存插件(YY一下)!

后续若发现新的问题也会到这里来补充!如果你在使用这个代码版缓存的时候也出现了新问题,也欢迎留言反馈,一遍完善这个代码版缓存功能!偷偷说一句,其实这个缓存代码稍稍修改,理论上同样适合其他PHP建站程序(一般人我不告诉他哦~)!

发表评论

gravatar

:?::razz::sad::evil::!::smile::oops::grin::eek::shock::???::cool::lol::mad::twisted::roll::wink::idea::arrow::neutral::cry::mrgreen:

刷新评论

目前评论:53   其中:访客  32   博主  21

  1. PHP二次开发 6 来自天朝的朋友 火狐浏览器 Windows 8 山东省济南市 联通

    很长时间没来了,博主好呀。

    • 张戈 [博主] 来自天朝的朋友 谷歌浏览器 Windows 7 广东省深圳市 电信

      你是大忙人。

  2. 舍力博客 3 来自天朝的朋友 火狐浏览器 Windows XP 山西省晋中市 联通

    我来混个脸熟!

  3. 陌小雨 5 来自天朝的朋友 火狐浏览器 Windows 8.1 广东省珠海市 电信

    高端!

  4. 少儿绘本 1 来自天朝的朋友 火狐浏览器5.0 Windows 8.1 山东省青岛市 联通

    代码一向是我所不懂的,不过也来支持下吧。

  5. 功能医学 0 来自天朝的朋友 谷歌浏览器 Windows XP 北京市海淀区 电信通

    对于php代码了解不是很多,所以很多东西都不敢随便动

  6. 必分享 2 来自天朝的朋友 谷歌浏览器 Windows 7 广东省佛山市 电信

    不错,受用。

  7. 小武 6 来自天朝的朋友 谷歌浏览器 Windows 8.1 北京市 方正宽带

    你这代码折腾的够高端…
    昨天拜读了你博客中[php生成sitemap]文章 . 果断杀掉sitemap生成插件. .又减少了一个插件. .
    现在博客中只剩下这个缓存插件了.. 还是不敢折腾他. :!:

    • 张戈 [博主] 来自天朝的朋友 谷歌浏览器 Windows 7 广东省深圳市 电信

      你看下我博客页面的源代码,这缓存代码已经被我优化堪比插件了。

      • 小武 6 来自天朝的朋友 谷歌浏览器 Windows 8.1 辽宁省大连市 电信

        嗯. 能看得出.
        至于这个插件, 我还是先不研究了. .
        我得研究研究怎么丰富我的博客内容..
        你的博客写的很令我羡慕.. 思路清晰. 结构非常工整. . 适合人类阅读 :wink:

        • 张戈 [博主] 来自天朝的朋友 谷歌浏览器 Windows 7 广东省深圳市 电信

          这样很累的,我一般写一篇文章需要2~4小时,甚至更多。有时候感觉还是很乱,比如这篇文章,到最后总觉得思维很紊乱,可能是我硬挤牙膏的后果,对了,你博客那个嗨一下,我已经集成了,改善了一下js,你可以试试~哈哈。

          • 小武 6 来自天朝的朋友 谷歌浏览器 Windows 8.1 辽宁省大连市 电信

            我好多文章写着写着就写不下去了. 完全找不到思路…然后就存到草稿…什么时候…已经给我自己挖过无数个坑了. . :sad:

          • 小武 6 来自天朝的朋友 谷歌浏览器 Windows 8.1 北京市 方正宽带

            找半天没找到high的按钮. . 无奈在Console里执行了一下 hig()方法体验了一下. . 改善了哪里? 没看出来!` :shock:

            • 张戈 [博主] 来自天朝的朋友 谷歌浏览器 Windows 7 广东省深圳市 电信

              你分享的功能,多次单击会叠加播放歌曲,而且还不能停止,只能刷新页面。
              我改了之后,单击一次就会切换一次歌曲。双击就能停止这个功能,是不是很赞呢?
              回头分享一下代码,虽然我知道你可以扒,哈哈~还是告诉别人一下。
              而且,中国博客联盟的导航,我都加了这个功能。

              • 小武 6 来自天朝的朋友 谷歌浏览器 Windows 8.1 北京市 方正宽带

                看来我只发现了一部分功能.
                我准备修改一下我的代码.. 实现双击任意地方即可停止播放..
                双击之前判断hig()方法是否执行. 我是怕high起来之后双击不到指定的标签… :lol:

                • 张戈 [博主] 来自天朝的朋友 谷歌浏览器 Windows 7 广东省深圳市 电信

                  非常简单,你没看到我额外写了一个stopCrazy函数么??
                  双击任何地方触发,也是非常简单的。待会我就改一下。
                  甚至可以,监听键盘,比如esc

          • 小武 6 来自天朝的朋友 谷歌浏览器 Windows 8.1 辽宁省大连市 电信

            通过源代码 .. 好一顿找. :!: 终于找到了. [双击停止] . 超赞的想法.

            • 张戈 [博主] 来自天朝的朋友 谷歌浏览器 Windows 7 广东省深圳市 电信

              扒代码能力超赞啊!哈哈~

              • 小武 6 来自天朝的朋友 谷歌浏览器 Windows 8.1 辽宁省大连市 电信

                职业直接影响了我对网页的使用习惯. 浏览器的开发者工具是常年开启状态.. . :arrow:

                • 张戈 [博主] 来自天朝的朋友 谷歌浏览器 Windows 7 广东省深圳市 电信

                  其实挺简单,我这个外行都玩的挺转,浏览器本身就是透明的,console里面每个函数都能看得到,直接输入hig 就得到了hig的代码,直接输入stopCrazy 就能得到停止函数。。。一切都是那么傻瓜式。

                  • 小武 6 来自天朝的朋友 谷歌浏览器 Windows 8.1 北京市 方正宽带

                    你己经很内行了. 有多少开发人员不懂得使用console

                    • 张戈 [博主] 来自天朝的朋友 谷歌浏览器 Windows 7 广东省深圳市 电信

                      搞网站被逼的,php,js,css,html甚至是抠图,都是玩博客之后学的,现在都是半吊子,不过足够应付我这个博客了,我本职工作还是玩服务器,玩系统。 :lol:

  8. 极品飞鸽 5 来自天朝的朋友 谷歌浏览器 Windows 7 四川省成都市 电信

    懂php的想怎么折腾就怎么折腾

    • 张戈 [博主] 来自天朝的朋友 谷歌浏览器 Windows 7 广东省深圳市 电信

      我也只是小白,略懂而已,还好有一个查资料的技能

  9. wingsBlog 4 来自天朝的朋友 谷歌浏览器 Windows 7 广东省广州市 电信

    好高端

    • 张戈 [博主] 来自天朝的朋友 谷歌浏览器 Windows 7 广东省深圳市 电信

      :???: 有嘛..

  10. 幻杀博客 5 来自天朝的朋友 谷歌浏览器 Windows 7 山东省潍坊市 联通

    哭了,为什么弄上清理却点不动呢?还用wp-dialog插件在我呢,也等同废了!滚动不滚,提示不显示。快哭了! :cry:

    • 张戈 [博主] 来自天朝的朋友 谷歌浏览器 Windows 7 广东省深圳市 电信

      一般的是js出错问题,按下F12把报错处理就好了。

  11. David 4 来自天朝的朋友 谷歌浏览器 Windows 8 上海市 联通

    终于把贵站代码缓存这个功能搞上了。
    分类目录的问题我也遇到了,第一次缓存的时候通常会出问题,但只要缓存生成了,第二次再刷新就没问题了。

    前台刷新缓存这个功能是否所有人都可以删掉缓存,这样会不会加重服务器负担?是删除所有,还是只是读者看到的页面,如果是前者,对优化来讲就不合理。

  12. David 4 来自天朝的朋友 谷歌浏览器 Windows 8 上海市 联通

    多级目录那个你可以去我站上产品目录上测试,如果从第二级分类下开始刷新,顺序点一次就没问题,如果倒过来,前面没建立过缓存,就会有问题。
    我再考虑怎么改,毕竟如果分类多的了话可能会是个麻烦问题,还有就是目录结构深了也会出问题。

  13. 幻杀博客 5 来自天朝的朋友 火狐浏览器 Windows 10 山东省潍坊市 联通

    发现这个代码的,不一定是要WP的,普通php编写的都可以缓存

    • 张戈 [博主] 来自天朝的朋友 谷歌浏览器 Windows 7 广东省深圳市宝安区 电信

      楼主正解。

  14. 博客分享 1 来自天朝的朋友 谷歌浏览器 Windows 7 辽宁省辽阳市 联通

    你的评论缓存刷新不好使了啊!
    我给你留言后你的评论列表里还是没显示我的!
    用右下角按钮刷新也没显示我的评论!

    • 张戈 [博主] 来自天朝的朋友 谷歌浏览器 Windows 7 广东省深圳市 电信

      oqcache缓存没设置好。

  15. Daniel 0 Hong Kong 谷歌浏览器 Windows 7 香港 电讯盈科有限公司

    是否不能手刪緩存後的文件呢?
    我手刪了之後, 全變成了空白頁…….怎樣恢復呢!

    另外是缓存路径–> “/home/wwwroot/zhangge.net/cache/zhangge.net/”.$real_slug.”/index.html”;

    如果我是放在根目錄cache, 是否 “/cache/xxx.com/”.$real_slug.”/index.htm”; 呢

    • 张戈 [博主] 来自天朝的朋友 谷歌浏览器 Windows 7 广东省深圳市 电信

      这个技术已经淘汰了,可以试试最新的Nginx缓存,http://zhangge.net/5042.html

  16. 博客分享 1 来自天朝的朋友 谷歌浏览器 Windows 7 辽宁省 联通

    有没有这种可能呢!就是将手动刷新和评论提交的按钮结合在一起!
    就是当用户点击 提交评论时也相当于刷新了该文章缓存
    这样提交评论后就能看到结果了

    • 张戈 [博主] 来自天朝的朋友 谷歌浏览器 Windows 7 广东省深圳市 联通

      不使用云加速此类CDN缓存,你的想法可以实现,顶多是2个JS动作合并而已。
      用了云加速缓存,那么你的想法就不能实现了。
      目前仅实现了提交评论自动清本地缓存,云加速的缓存是没法清理的,所以不现实。
      提交评论+自动刷新本页评论,这个是可以实现,有2个弊端:
      ①、提交后自动刷新,那么就没法重新编辑刚刚的评论。
      ②、任何人提交都刷新,一是带来不必要的负载,二是重新打开该文章依然看不到评论(有云加速缓存)

  17. 小幻 5 来自天朝的朋友 谷歌浏览器 Windows 7 北京市 电信互联网数据中心

    无聊重新折腾了下,page_name这个变量是干什么的,删掉那货,全部正常。。。。

    • 张戈 [博主] 来自天朝的朋友 谷歌浏览器 Windows 7 广东省深圳市 联通

      这个只是用来防止别人在前台恶意刷这个功能,写入cookies简单防一下。文章代码实际上没加入,就定义了下,不应该会带来问题。。。

  18. 小幻 5 来自天朝的朋友 谷歌浏览器 Windows 7 北京市朝阳区 北京数据家科技有限公司(北苑路170号凯旋城C座26层)

    前台清理缓存的php用的unlink删除,删除的路径不是应该是相对于cache.php的路径吧…

    • 张戈 [博主] 来自天朝的朋友 谷歌浏览器 Windows 7 广东省深圳市 电信

      懒得写变量,直接写死就是。

  19. 小幻 5 来自天朝的朋友 谷歌浏览器 Windows 7 北京市 电信通

    刚刚给我的vip站也加了静态化,不过我的站写的是响应式的,又懒得在弄个三级或者是二级目录
    想了下,改了改你的cache.php文件
    if($_GET[‘mobile’]==’1′){//这个地方可以用PHP直接判断是否移动端
    $root = ‘wap’;
    }else{
    $root = ‘pc’;
    }
    define(‘CACHE_ROOT’, dirname(__FILE__).’/cache/’.$root);
    这个样子 就可以完全解决响应式缓存了 移动端/PC端页面 的问题了
    我那个地方用mobile参数是 因为我为了方便在伪静态url重写地方判断了是否移动端,加上了mobile参数
    可以直接if(is_mobile())这样判断//is_mobile判断是否移动端函数就可以了~
    不过多域名缓存好像木用了,只能缓存是否移动端了~
    这个建议希望采纳23333333~
    麻麻再也不怕看到PC/移动端页面了

    • 张戈 [博主] 来自天朝的朋友 QQ浏览器 Windows 7 广东省广州市 电信

      想法不错,不过这是个淘汰的缓存方案了,懒得修改了,大家看你的评论就好。

  20. SHENG 1 来自天朝的朋友 火狐浏览器5.0 Windows 7 广东省深圳市 电信

    博主,求助!有没有静态化后浏览统计代码?

    • 张戈 [博主] 来自天朝的朋友 QQ浏览器 Windows 7 广东省广州市 电信

      wp-postviews插件默认支持静态ajax统计

      • SHENG 1 来自天朝的朋友 火狐浏览器5.0 Windows 7 广东省深圳市 电信

        已经用了,但用代码版缓存后没效果,不会加载ajax

  21. Hank 1 来自天朝的朋友 谷歌浏览器 Windows 10 福建省泉州市 电信

    我用的The7主题,缓存代码 不知道是不是wp-includes底下的cache.php,没找到auto_cache这个函数模块

  22. 小舞 2 来自天朝的朋友 谷歌浏览器 Windows 10 河南省南阳市 联通

    张戈大大。最近我发现了一个问题,但是我不知道怎么解决,我也确定问题来源
    插件启用后提示 页面不相符!时间戳有差异或者不存在!
    确认的问题是百度云加速导致的,但是我不知道怎么解决,求指教

    • 张戈 [博主] 来自天朝的朋友 Netscape Navigator iPhone iPhone OS 10_2 like Mac OS X 广东省广州市 电信

      我没遇到过,但你说和cdn有关,我想你绕过Cdn就好了。在服务器上编辑/etc/hosts 文件,把你的域名指向127.0.0.1即可。比如
      127.0.0.1 domain.com
      只是服务器上绕过,不影响用户访问加速

  23. 野人摊影视分享 3 来自天朝的朋友 谷歌浏览器 Windows 7 福建省宁德市 电信

    差两个问题没有解决,也是同样的问题,发布时删除缓存和评论时删除缓存,在本地用phpstudy测试的,环境是apache+php5.3n, 这两个执行不成功, unlink($m_cat_file); rmdir($m_cat_dir),但是单独php写这两个命令,又能成功,真没办法了,还望张戈大神,帮帮忙哈!PS:没用插件wp-super-cache的原因是,移动端和pc的端的广告不一样,有时候在移动端缓存的是电脑端的广告,导致界面各种不坑,没办法只能弃坑了,花了一天时间阅读了代码版的文章,只能算是把缓存分成两部分,就差个更新/发布/评论文章删除缓存这个没成功,所以只能麻烦下大神你。还望多多指教!谢谢!

  24. licy 0 来自天朝的朋友 谷歌浏览器 Windows 10 中国 移动

    很简单的处理办法:
    ①、打开主题目录下的404.php模板(国产主题大部分有),然后在任意位置插入
    ②、编辑缓存代码,在auto_cache函数里面插入如下代码:
    if (preg_match(“//i”,$contents,$matches)) {
    rmdir($cache_dir);
    return $contents;
    }

    求助!!!刷新后404页面变成了:找不到与以下网址对应的网页:http://*.com/dongtai586
    HTTP ERROR 404,而不是返回正常的404页面,查看缓存目录,发现有生成目录但没有生产index.html文件,其他页面可正常缓存,怎么解决啊?是不是匹配哪里出现问题呢?

    • 张戈 [博主] 来自天朝的朋友 QQ浏览器 Mac OS X 10_11_3 广东省深圳市 电信

      插错地方了吧

加载中,请稍候...