wordpress优化之WP Super Cache静态缓存插件纯代码版网站生成静态

wordpress优化之WP Super Cache静态缓存插件纯代码版网站生成静态

前言:

前面已经说过了,由于我资源站也是wordpress程序,也是这个主题,一直被攻击,被恶意访问,导致CPU过大,这个一般还不是高防御就可以解决的,再说了咱们草根站长哪有那个资金呢,每天0收入,还这么拼,为啥了,就是爱好吧!我为啥新创建了一个博客?就是为了记录,分享,另一个资源站,单纯的采集别人资源啦!嘿嘿!不管怎么样!我的资源站,目前好了,用了静态缓存,还生成了静态页面,之前一直折腾wp super cache插件,和其他很多插件,都没法用,无法生成静态页面!哎没办法啊!!!!!!

之前我已经做了第一步,请查看:点我查看

正文

直接转载的而来,我只是用了第一部分的,可以生成静态页面,我的问题应该就解决了!

一、何为多域名?

正式分享之前,我必须说清楚一下,什么是多域名网站!

熟悉的朋友,应该知道张戈博客除了liye5.com之外,还有一个m.liye5.com的移动域名。当js检测到是移动端的UA时,将会自动跳转到m.liye5.com,从而实现移动端的适配跳转。

以前分享这个跳转的时候,我下意识的以为,这种跳转可以兼容任意缓存,比如cos-html-cache等。实际上发现,这种跳转只能兼容wp super cache!原因是:只有wp super cache 是分域名来储存缓存文件的,其他插件包括代码版都不区分域名,统统存到同一个路径,于是就出现了无限死循环跳转的窘迫,因为缓存文件是同一个,跳了之后还是PC的缓存,怎么跳都跳不出这个死循环!!(估计又有人看不懂了,不过无所谓,真正需要的时候肯定看得懂!)

言归正传,既然wp super cache可以兼容多域名网站,那代码版肯定也可以做到!测试了十来分钟,就搞定了!存放结构都和wp-super-cache一样!

下面分享一下详细步骤:

二、部署代码

<?php
//原缓存路径拼接当前请求域名的文件夹,从而可以区分m.zhang.ge还是zhang.ge,或是其它...
define('CACHE_ROOT', dirname(__FILE__).'/cache/'.$_SERVER['HTTP_HOST']);
define('CACHE_LIFE', 86400); //缓存文件的生命期,单位秒,86400秒是一天
define('CACHE_SUFFIX','.html');  //缓存文件的扩展名,千万别用 .php .asp .jsp .pl 等等
 
//首页以index.html缓存,其他以【请求路径/index.html】缓存,如【1234.html/index.html】(同wp super cache)
if($_SERVER['REQUEST_URI'] == '/'){
    $file_name  = "index".CACHE_SUFFIX;
    $cache_dir  = CACHE_ROOT;
} else {
    $file_name  = 'index.html';
    //过滤带参数的地址,避免重复缓存浪费资源:
    $target_url = preg_replace('/(\/comment|page|#|\?|:).*$/','',$_SERVER['REQUEST_URI']);
    $cache_dir  = CACHE_ROOT.$_SERVER['REQUEST_URI'];
}
//缓存文件存放路径
$cache_file = $cache_dir.'/'.$file_name;    
//缓存黑名单:已过滤WP搜索、订阅、地图等,若要添加更多请用分隔符|隔开:
$Filter_list = '/(\?s=|feed|map|page|404|%|xml|txt|tag|author)/';
if($_SERVER['REQUEST_METHOD']=='GET' && !preg_match_all($Filter_list,$_SERVER['REQUEST_URI'],$matches)){      
    if(file_exists($cache_file) && time() - filemtime($cache_file) < CACHE_LIFE){   //如果缓存文件存在,并且没有过期,就把它读出来。
        $fp = fopen($cache_file,'rb');
        fpassthru($fp);
        fclose($fp);
        exit();
    }
    elseif(!file_exists($cache_dir)){
        if(!file_exists(CACHE_ROOT)){
            mkdir(CACHE_ROOT,0777);
            chmod(CACHE_ROOT,0777);
        }
        mkdir($cache_dir,0777);
        chmod($cache_dir,0777);
    }
    function auto_cache($contents){         //回调函数,当程序结束时自动调用此函数
        global $cache_file;
        $fp = fopen($cache_file,'wb');
        fwrite($fp,$contents);
        fclose($fp);
        chmod($cache_file,0777);
        clean_old_cache();                  //生成新缓存的同时,自动删除所有的老缓存。以节约空间。
        return $contents;
    }
    function clean_old_cache(){
        chdir(CACHE_ROOT);
        foreach (glob("*/*".CACHE_SUFFIX) as $file){
           if(time()-filemtime($file)>CACHE_LIFE){
               unlink($file);
           }
        }
    }
    ob_start('auto_cache');                 //回调函数 auto_cache
}
else{
    if(file_exists($cache_file)){           //file_exists() 函数检查文件或目录是否存在。
        unlink($cache_file);                //不是GET的请求就删除缓存文件。
    }
}
?>

以下是三种缓存机制中,缓存文件存放路径的对比:

①、原缓存代码存放路径为:
/网站根目录/cache/请求路径前2位MD5值/MD5字符串(很难区分是哪篇文章!)
 
②、#nginx下开启mod_rewrite模式时,wp super cache的缓存路径是:
/网站根目录/wp-content/cache/supercache/请求域名/请求路径/index.html
 
③、我修改后的缓存代码存放路径则变成:
/网站根目录/cache/请求域名/请求路径/index.html

部署方法还是和原代码一致:

将以上代码保存为cache.php上传到网站根目录,然后修改网站根目录的index.php,在第一个<?php 后添加代码:

require('cache.php');

现在,只要刷新一下网站前台,就能在cache里面看到内容了,而且结构和WP Super Cache一致:

很明显,我参考了WP Super Cache的存放路径,请求域名的不同,存放位置也会不同,从而避免了多个域名请求到同一个缓存文件,造成跳转死循环的问题!(不得不说WP Super Cache想得很周到!)

当然,如果你想改成和WP Super Cache一样的存放路径,只需要将第二行代码如下修改即可

define('CACHE_ROOT', dirname(__FILE__).'/wp-content/cache/'.$_SERVER['HTTP_HOST']);

三、更多补刀

①、找回CDN功能

用过WP Super Cache的朋友,应该知道这个插件还自带CDN功能,很全面!那么换成代码版,当然也不能漏掉这个实用功能!

正好歧路亡羊博客分享了水煮鱼的七牛CDN插件的代码版,直接拿来主义,然后强迫症缩进一下:

//水煮鱼的七牛CDN插件代码版
define('FocusCDNHost','https://www.liye5.com'); //wordpress网站网址
define('FocusCDNRemote','http://www.liye5.com'); //cdn域名
define('FocusCDNIncludes','wp-content,wp-includes'); //设置加速目录
define('FocusCDNExcludes','.php|.xml|.html|.po|.mo');  //设置文件白名单
define('FocusCDNRelative','');
function do_cdnrewrite_ob_start() {
    $rewriter = new FocusCDNRewriteWordpress();
    $rewriter->register_as_output_buffer();
}
add_action('template_redirect', 'do_cdnrewrite_ob_start');
class FocusCDNRewriteWordpress extends FocusCDNRewrite
{
    function __construct() {
        $excl_tmp = FocusCDNExcludes;
        $excludes = array_map('trim', explode('|', $excl_tmp));
        parent::__construct(
            FocusCDNHost,
            FocusCDNRemote,
            FocusCDNIncludes,
            $excludes,
            !!FocusCDNRelative
        );
    }
public function register_as_output_buffer() {
    if ($this->blog_url != FocusCDNRemote) {
        ob_start(array(&$this, 'rewrite'));
        }
    }
}
class FocusCDNRewrite {
    var $blog_url    = null;
    var $cdn_url     = null;
    var $include_dirs   = null;
    var $excludes    = array();
    var $rootrelative   = false;
function __construct($blog_url, $cdn_url, $include_dirs, array $excludes, $root_relative) {
    $this->blog_url   = $blog_url;
    $this->cdn_url    = $cdn_url;
    $this->include_dirs  = $include_dirs;
    $this->excludes   = $excludes;
    $this->rootrelative  = $root_relative;
}
protected function exclude_single(&$match) {
    foreach ($this->excludes as $badword) {
        if (stristr($match, $badword) != false) {
            return true;
        }
    }
    return false;
}
protected function rewrite_single(&$match) {
    if ($this->exclude_single($match[0])) {
        return $match[0];
    } else {
    if (!$this->rootrelative || strstr($match[0], $this->blog_url)) {
        return str_replace($this->blog_url, $this->cdn_url, $match[0]);
    } else {
        return $this->cdn_url . $match[0];
        }
    }
}
protected function include_dirs_to_pattern() {
    $input = explode(',', $this->include_dirs);
    if ($this->include_dirs == '' || count($input) < 1) {
        return 'wp\-content|wp\-includes';
    } else {
        return implode('|', array_map('quotemeta', array_map('trim', $input)));
    }
}
public function rewrite(&$content) {
    $dirs = $this->include_dirs_to_pattern();
    $regex = '#(?<=[(\"\'])'; $regex .=$this->rootrelative ? ('(?:'.quotemeta($this->blog_url).')?') : quotemeta($this->blog_url); $regex .='/(?:((?:'.$dirs.')[^\"\')]+)|([^/\"\']+\.[^/\"\')]+))(?=[\"\')])#';
    return preg_replace_callback($regex, array(&$this, 'rewrite_single'), $content);
    }
}

根据实际情况修改以上代码的2~3行,最后粘贴到主题目录下的functions.php文件的最后一个?>之前即可。

如果和张戈博客一样,有一个PC主题,还有个移动主题,那么2个主题的functions.php都需要添加,但是要注意修改不同的域名.

今天记录先到这里哦

分享到 :
相关推荐

发表评论

电子邮件地址不会被公开。 必填项已用*标注