前言
最近喜欢上了静态化缓存,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"的字样,如果有,则表示你配置成功了。否则请检查上述步骤。
后言
参考地址:张戈博客