启用WP Super Cache纯代码版本之后的一些优化措施 | 张戈博客

  • 时间:
  • 浏览:2

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

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

下面,简单的说一下启用此功能后遇到的你这人疑问的补救最好的最好的办法 或细项优化。

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

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

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

④、管理员回复评论也会发送邮件给管理员(①、②项补救OK之前 发现的疑问);

⑤、无法保存评论者信息,你这人是开启缓存之前 的诟病,之前 已分享过变相补救最好的最好的办法 。

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

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

⑦、缓存清理过高 方便;

⑧、缓存这麼时间戳;

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

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

⑾、会缓存不居于的页面(404),可能性被搜索引擎抓取造成SEO影响(缓存以都会是50情况);

⑿、带补充

一、过滤用户信息

针对第⑥条:

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

之前 浏览器突然是有cookies,你这人你这人每次打开时,博客的js都会自动加载已保存的信息,也只是的突然用的信息。今天鬼使神差的试了下无痕模式,才发现了你这人BUG,尼玛把我该人填写的信息都给缓存了,这是泄漏他人隐私啊!何如让也对新用户体验很差!

仔细看得人下缓存代码,懒得深究何如会缓存用户浏览器的内容,直接在cache.php中加入了置空机制,追到你这人疑问:

function auto_cache($contents){//回调函数,当多线程池池


开始英语

时自动调用此函数
   global $cache_file;
   $fp = fopen($cache_file,'wb');
   //新增替换代码 Start
   //①. 替换已缓存的用户头像路径为默认
   $contents = preg_replace('/<img id="real-time-gravatar" src=".*?"/','<img id="real-time-gravatar" src="//res.zgboke.com/wp-content/themes/HotNewspro/images/default_avatar.jpg"',$contents);
   
   //②. 置空已缓存的用户名称
   $contents = preg_replace('/<input type="text" name="author" id="author" class="commenttext" value=".*" size="22" tabindex="1" \/>/','<input type="text" name="author" id="author" class="commenttext" value="" size="22" tabindex="1" \/>',$contents);

   //③. 置空已缓存的用户邮箱
   $contents = preg_replace('/<input type="text" name="email" id="email" class="commenttext" value=".*" size="22" tabindex="2" \/>/','<input type="text" name="email" id="email" class="commenttext" value="" size="22" tabindex="2" \/>',$contents);
   
   //④. 置空已缓存的用户网址
   $contents = preg_replace('/<input type="text" name="url" id="url" class="commenttext" value=".*" size="22" tabindex="3" \/>/','<input type="text" name="url" id="url" class="commenttext" value="" size="22" tabindex="3" \/>',$contents);
   //新增替换代码 End
   fwrite($fp,$contents);
   fclose($fp);
   chmod($cache_file,0777);
   clean_old_cache(); //生成新缓存的共同,自动删除所有的老缓存。以节约空间。
   return $contents;
}

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

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

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

preg_replace('/搜索字符串/','替换字符串','全部内容')

比如,还要将hello word! 替换为 hello zhangge!,则还可以 原先写:

preg_replace('/world/','zhangge','hello world!')

何如让,我还要置空缓存内容中的用户名、邮箱及网址,也只是有另一个最简单的正则匹配过程,比如替换用户名:

//搜索条件中只用了有另一个正则匹配,那只是value=".*"
$contents = preg_replace('/<input type="text" name="author" id="author" class="commenttext" value=".*" size="22" tabindex="1" \/>/','<input type="text" name="author" id="author" class="commenttext" value="" size="22" tabindex="1" \/>',$contents);

你这人你这人,可能性你在使用代码版的缓存功能之前 ,发现你这人内容被意外缓存了,只是使用你这人最好的最好的办法 替换掉即可。

二、前台缓存清理

针对第⑦条

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

①、新增JS+ajax 代码:

<script type="text/javascript">
var cache = null;
<?php 
    if(is_single()){
	echo "var page_type = 'single';";
	echo "var page_slug = 'null';";
    } else if(is_page()){ 
	$post_data = get_post($post->ID, ARRAY_A);
	$slug = $post_data['post_name'];
	echo "var page_type = 'page';";
	echo "var page_slug = '".$slug."';";
    } else if(is_category()){
        $cat = get_query_var('cat');
        $theCat = get_category($cat);
        echo "var page_slug = '".$theCat->slug."';";
	echo "var page_type = 'category';";
    } else if(is_home()){ 
        echo "var page_type = 'home';";
	echo "var page_slug = 'null';";
    } else {
	echo "var page_type = 'null';";
	echo "var page_slug = 'null';";
    }
echo "var post_id = ".$post->ID.";";
echo "var page_name = cache_".$post->ID.";";
?>
//触发函数:点击id为clean元素时将清理该页面缓存
$(function(){ 
    $("#clean").click(function(){ 
            CleanUp();
    }); 
});

//ajax清理函数
function CleanUp(){
    $.ajax({
        type:'POST',
        data:{
            "action": "delcache",
            "page_type": page_type,
            "post_id": post_id,
            "slug": page_slug,
            },
        //ajax对象文件:cache.php,即上一篇文章中的静态缓存的php文件
        url: '/cache.php',
        cache: false, 
        error: function(){ 
            alert('居于意外错误!'); 
            return false; 
        }, 
        success:function(){
            alert('清理成功!选着后将自动刷新本页...');
            location.reload(true);
        }
    }); 
}
</script>

将以上代码再加到主题footer或合并到你这人js当中均可,还要注意的是,在此代码之前 还要先正常载入Jquery。

②、新增php代码:

//缓存清理代码(实际使用,请自行修改缓存路径!)
if(isset($_POST['action'])){
    if($_POST['action'] == 'delcache'){
        if($_POST['page_type'] == 'single'){
            $post = $_POST['post_id'];
            $cachefile = "/home/wwwroot/zhang.ge/cache/zhang.ge/".$post.".html/index.html";
            $cachedir = "/home/wwwroot/zhang.ge/cache/zhang.ge/".$post.".html";
        } else if($_POST['page_type'] == 'page') {
            $post = $_POST['slug'];
            $cachefile = "/home/wwwroot/zhang.ge/cache/zhang.ge/".$post."/index.html";
            $cachedir = "/home/wwwroot/zhang.ge/cache/zhang.ge/".$post;
        } else if($_POST['page_type'] == 'category') {
            $post = $_POST['slug'];
            $cachefile = "/home/wwwroot/zhang.ge/cache/zhang.ge/".$post."/index.html";
            $cachedir = "/home/wwwroot/zhang.ge/cache/zhang.ge/".$post;
        } else if($_POST['page_type'] == 'home') { 
            $cachefile = "/home/wwwroot/zhang.ge/cache/zhang.ge/index.html";
        } else {
            exit();
        }
        if($_POST['page_type'] == 'home'){
            if (file_exists($cachefile)) {
                unlink($cachefile);
            }
        } else if($_POST['page_type'] != 'null') {
            if (file_exists($cachefile)) {
                unlink($cachefile);
                rmdir($cachedir);
            }
        } else {
           exit(); 
        }
    }
    exit();
}

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

注意:cache.php和js代码中的url对象是 一 一对应的!!这篇文章主只是针对上一篇文章而写的,你这人你这人只是cache.php,可能性想改成你这人php文件,也是还可以 的,但前提条件是和js中url对象要一致!

③、新增触发按钮

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

最简单的写法如下:

<img src="图片路径" id="clean">

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

三、加入缓存时间

针对第⑧条:

可能性缓存页面这麼时间戳,会给你分不清楚你这人缓存页面是那些之前 生成的,可能性有时删除了缓存文件,在前台刷新看得人的依然是缓存内容(nginx通常会产生有另一个504的浏览器缓存)!可能性有个时间戳,就能更加容易的区分否有有最新的缓存。

补救最好的最好的办法 很简单,在缓存时在代码最后新增时间戳即可,和WP Super Cache一样!

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

function auto_cache($contents){         //回调函数,当多线程池池


开始英语

时自动调用此函数
   global $cache_file;
   $fp = fopen($cache_file,'wb');
   $contents = preg_replace('/<img id="real-time-gravatar" src=".*?"/','<img id="real-time-gravatar" src="//res.zgboke.com/wp-content/themes/HotNewspro/images/default_avatar.jpg"',$contents);
   $contents = preg_replace('/<input type="text" name="author" id="author" class="commenttext" value=".*" size="22" tabindex="1" \/>/','<input type="text" name="author" id="author" class="commenttext" value="" size="22" tabindex="1" \/>',$contents);
   $contents = preg_replace('/<input type="text" name="email" id="email" class="commenttext" value=".*" size="22" tabindex="2" \/>/','<input type="text" name="email" id="email" class="commenttext" value="" size="22" tabindex="2" \/>',$contents);
   $contents = preg_replace('/<input type="text" name="url" id="url" class="commenttext" value=".*" size="22" tabindex="3" \/>/','<input type="text" name="url" id="url" class="commenttext" value="" size="22" tabindex="3" \/>',$contents);
   //如下新增2行代码即可在缓存页面的最后输出时间戳!
   date_default_timezone_set('Asia/Shanghai'); 
   $contents.="\n<!-- Power By WordPress纯静态缓存代码,生成日期:".date('Y-m-d h:i:s',time())." -->";  
   fwrite($fp,$contents);
   fclose($fp);
   chmod($cache_file,0777);
   clean_old_cache();                  //生成新缓存的共同,自动删除所有的老缓存。以节约空间。
   return $contents;
}

四、发布时删除缓存

针对第⑨条:

你这人疑问虽然很好补救,只是使用WordPress钩子在发布或更新文章时,调用删除缓存函数即可,具体如下:

//发布或更新文章时删除文章、首页和对应分类缓存
function DelSingleCache($post_ID){
    $category = get_the_category();
    $slug = $category[0]->category_nicename;
    if($slug=='itnews' || $slug=='feeling') {
        $real_slug = "others/".$slug;
    } else if ($slug=='web' || $slug=='os' || $slug=='db') {
        $real_slug = "op/".$slug;
    } else {
            $real_slug = $slug;
    }
    $single_file = "/home/wwwroot/zhang.ge/cache/zhang.ge/".$post_ID.".html/index.html";
    $single_dir = "/home/wwwroot/zhang.ge/cache/zhang.ge/".$post_ID.".html";
    $cat_file = "/home/wwwroot/zhang.ge/cache/zhang.ge/".$real_slug."/index.html";
    $cat_dir = "/home/wwwroot/zhang.ge/cache/zhang.ge/".$real_slug;    
    $home_cache = "/home/wwwroot/zhang.ge/cache/zhang.ge/index.html";
    
    $m_single_file = "/home/wwwroot/zhang.ge/cache/m.zhang.ge/".$post_ID.".html/index.html";
    $m_single_dir = "/home/wwwroot/zhang.ge/cache/m.zhang.ge/".$post_ID.".html";    
    $m_cat_file = "/home/wwwroot/zhang.ge/cache/m.zhang.ge/".$real_slug.".html/index.html";
    $m_cat_dir = "/home/wwwroot/zhang.ge/cache/m.zhang.ge/".$real_slug.".html";          
    $m_home_cache = "/home/wwwroot/zhang.ge/cache/m.zhang.ge/index.html";    
    if (file_exists($single_file)) {
        unlink($single_file);
        rmdir($single_dir);
    }
    if (file_exists($m_single_file)) {
        unlink($m_single_file);
        rmdir($m_single_dir);
    }    
    if (file_exists($home_cache)) {
        unlink($home_cache);
    }
    if (file_exists($m_home_cache)) {
        unlink($m_home_cache);
    }    
    if (file_exists($cat_file)) {
        unlink($cat_file);
        rmdir($cat_dir);
    }
    if (file_exists($m_cat_file)) {
        unlink($m_cat_file);
        rmdir($m_cat_dir);
   }
    exec(EscapeShellCmd("/opt/reload_nginx.sh"));  
}
add_action('publish_post', 'DelSingleCache');

//发布或更新页面时删除页面缓存
function DelPageCache($post_ID){
    $post_data = get_post($post->ID, ARRAY_A);
    $slug = $post_data['post_name'];
    $page_file = "/home/wwwroot/zhang.ge/cache/zhang.ge/".$slug."/index.html";
    $page_dir = "/home/wwwroot/zhang.ge/cache/zhang.ge/".$slug;    
    $m_page_file = "/home/wwwroot/zhang.ge/cache/m.zhang.ge/".$slug."/index.html";
    $m_page_dir = "/home/wwwroot/zhang.ge/cache/m.zhang.ge/".$slug;
    if (file_exists($page_file)) {
        unlink($page_file);
        rmdir($page_dir);
    } 
    if (file_exists($m_page_file)) {
        unlink($m_page_file);
        rmdir($m_page_dir);
    }         
    exec(EscapeShellCmd("/opt/reload_nginx.sh"));  
}
add_action('publish_page', 'DelPageCache');

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

Ps:关于删除缓存的所有代码中(包括前面的ajax清理功能),若居于二级分类,这麼分类缓存路径可能性还要进一步修改一下,才会更准确,可能性你不清楚,这麼用上边的代码也这麼任何疑问!

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

//根据张戈博客分类实际情况,itnews/feeling/web/os/db那些分类都是二级分类,你这人你这人还要再加其父分类路径:
if($slug=='itnews' || $slug=='feeling') {
   $real_slug = "others/".$slug;
} else if ($slug=='web' || $slug=='os' || $slug=='db') {
   $real_slug = "op/".$slug;
} else {
   $real_slug = $slug;
}
$cat_file = "/home/wwwroot/zhang.ge/cache/zhang.ge/".$real_slug."/index.html";
$cat_dir = "/home/wwwroot/zhang.ge/cache/zhang.ge/".$real_slug;

五、index.php跳转

针对第⑩条

今天,在看百度收录的之前 ,突然看得人如下情况:

试了下,没开启缓存的博客在首页上边再加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$

尼玛百度只是这麼任性!!!不遵守协议。

②、501跳转最好的最好的办法 :

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

//补救index.php也还可以

访问带来的SEO疑问
$the_host = $_SERVER['HTTP_HOST'];
$the_url = isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : '';
$the_host = strtolower($the_host);
$the_url = strtolower($the_url); 
if($the_url=="/index.php") {
    header('HTTP/1.1 501 Moved Permanently');
    header('Location:http://'.$the_host);
}

将以上代码再加到cache.php的<?php之前 即可,当然也还可以 中放网站根目录的index.php的<?php上边。

如图所示:

保存之前 ,在访问带index.php的首页就能自动跳转到不带index.php,从而补救了你这人困惑。

六、禁止缓存404

针对第⑾条

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

先不说原先的文件夹会不想逼死强迫症。一旦那些奇葩路径被缓存,这麼再次被访问,返回的就不再是404情况了,只是正常的50情况!

典型案例:明明是有另一个404错误,可能性被缓存了,就被百度给收录了:

很简单的补救最好的最好的办法 :

①、打开主题目录下的404.php模板(国产主题大累积有),何如让在任意位置插入<!– 404nocache –>;

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

function auto_cache($contents){ //也只是这行上边插入以下代码:可能性居于404nocache注释就不缓存!
   if (preg_match("/<!-- 404nocache -->/i",$contents,$matches)) {
      rmdir($cache_dir);
      return $contents;
   }

原先补救一下,就完美补救了会缓存404不居于页面的疑问了!


好了,目前就发现了这十几个 疑问,也一 一补救了,我我该人回顾了一下,发现这代码版几乎可能性实现了WP Super Cache的绝大累积功能,甚至更好!!有时间,我会尝试将其分发开发成比cos-html-cache、wp super cache更优秀的缓存插件(YY一下)!

后续若发现新的疑问也会到这里来补充!可能性你在使用你这人代码版缓存的之前 也突然出现了新疑问,也欢迎留言反馈,一遍完善你这人代码版缓存功能!偷偷说一句,虽然你这人缓存代码稍稍修改,理论上同样适合你这人PHP建站多线程池池 (一般人我不告诉他哦~)!