• 欢迎访问好鸭,WordPress信息,WordPress教程,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏好鸭吧

Wordpress免插件实现静态化(代码版WP Super Cache)

WordPress haoduck 12个月前 (04-20) 490次浏览 0个评论

前言

最近喜欢上了静态化缓存,WordPress生成html的缓存插件有很多

仍在更新的有WP Super Cache、WP Fastest Cache、W3 Total Cache等

都稍微尝试了一下,个人认为WP Super Cache的易用性和功能比较强,支持分域名分文件存放缓存文件,支持CDN,便深入"研究"了一番

起初体验非常好,不过体验好的日子并不长久,近来就出现问题了,缓存文件可以正常生成,但是前台实际并没有指向缓存文件,尝试重新配置,重开插件能无果

搜索了一番也没找到解决方法

接着搭建了一个测试站点,安装的WP Super Cache插件,配置了好久,却连缓存文件都无法生成,搜了了一番,并无有效的答案。

后面在张戈大佬的博客看见了"代码版WP Super Cache",实现的效果和WP Super Cache插件基本没区别

便依葫芦画瓢尝试配置了一番,目前状况良好

正文

1 部署代码

<?php
//原缓存路径拼接当前请求域名的文件夹
define('CACHE_ROOT', dirname(__FILE__).'/wp-content/cache/htmlcache/'.$_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,0755);
            chmod(CACHE_ROOT,0755);
        }
        mkdir($cache_dir,0755);
        chmod($cache_dir,0755);
    }
    function auto_cache($contents){         //回调函数,当程序结束时自动调用此函数
        global $cache_file;
        $fp = fopen($cache_file,'wb');
        fwrite($fp,$contents."\n<!--HTML_Cache-->");          //页面底部添加缓存注释
        fclose($fp);
        chmod($cache_file,0666);
        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.php上传到网站根目录,你可以在代码第3行自定义你想用来存放HTML文件的路径

然后修改网站根目录的index.php,在第一个

<?php

后添加代码:

require('cache.php');

现在,只要刷新一下网站前台,就能在wp-content/cache里面看到缓存内容了。但是,在此之前,要确保你在上一步代码第三行中自定义的路径是存在的,否则前台会报错

2 配置Nginx的mod_rewrite规则使缓存生效

如果你细心就可以发现,虽然缓存文件已经生成了,但是前台并非展现的是缓存文件,所以我们还要修改Nginx配置(伪静态规则)

这是原本的伪静态规则

location /
{
	 try_files $uri $uri/ /index.php?$args;
}

rewrite /wp-admin$ $scheme://$host$uri/ permanent;

这是设置缓存后的伪静态规则,如果你的缓存文件存放路径和我的不一样,那么也要将下列代码中13行的路径修改一下

location /
{
           #缓存规则开始!
           # 如果请求的文件已存在,直接返回
           if (-f $request_filename) {
               break;
           }
           set $supercache_file '';
           set $ihttp_host '';
           set $supercache_uri $request_uri;
           if ($supercache_uri ~ ^(.+)$) {
               #请注意:下面这行代码的路径对应缓存代码中的CACHE_ROOT定义的路径:
               set $supercache_file /wp-content/cache/htmlcache/$http_host$1/index${ihttp_host}.html;
           }
           # 只有当缓存文件存在时,才进行 rewrite
           if (-f $document_root$supercache_file) {
               #rewrite ^(.*)$ $supercache_file break;
               rewrite ^ $supercache_file last;
           }
           # 所有其他请求,转给 wordpress 处理
           if (!-e $request_filename) {
               rewrite . /index.php last;
           }
           #缓存规则结束!
           #下面部分是nginx原有规则....
	 try_files $uri $uri/ /index.php?$args;
}

rewrite /wp-admin$ $scheme://$host$uri/ permanent;

3 判断缓存是否生效

刷新一下网站首页,查看网页源代码,看看底部有没有"HTML_Cache"的字样,如果有,则表示你配置成功了。否则请检查上述步骤。

后言

参考地址:张戈博客


好鸭 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:Wordpress免插件实现静态化(代码版WP Super Cache)
喜欢 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址