wordpress页面缓存静态化,优化提速100%!!

发布于 / 系统运维 / 5 条评论

wordpress使用了大量插件,随着时间推移,数量庞大的图片和文章,甚至是历史遗留的冗余组件等严重影响网站响应速度!

站长们一般用的是WP Super Cache或者Hyper Cache什么的,

原理是直接将网站的页面生成静态的html页面,然后使用Mod_rewrite将请求转发到静态文件,这样就跳过了php解析这一步直接将页面吐出到浏览器,从而达到加速的效果。但是这是使用插件实现缓存效果,那么可否无插件实现呢?

首先复制以下代码:

<?php
 define('CACHE_ROOT', dirname(__FILE__).'/cache');
 define('CACHE_LIFE', 3600); //缓存文件的生命期,单位秒,3600秒是一小时
 define('CACHE_SUFFIX','.html'); //缓存文件的扩展名,千万别用 .php .asp .jsp .pl 等等

$file_name = md5($_SERVER['REQUEST_URI']).CACHE_SUFFIX; //缓存文件名

//缓存目录,根据md5的前两位把缓存文件分散开。避免文件过多。如果有必要,可以用第三四位为名,再加一层目录,尽可能少文件夹,以免影响性能。

$cache_dir = CACHE_ROOT.'/'.substr($file_name,0,3);
 $cache_file = $cache_dir.'/'.$file_name; //缓存文件存放路径

if($_SERVER['REQUEST_METHOD']=='GET'){ //GET方式请求才缓存,POST之后一般都希望看到最新的结果
 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.php文件然后放置到网站的目录(不是主题的目录!),然后在根目录下再创建一个名为cache的目录权限更改为777(修改权限可写,写入缓存文件用的)

然后在网站根目录的index.php的<?php之后加上以下代码:

require('cache.php');

一定要保证缓存目录的可写。

一定要加到文件的最上方,不然等页面完全加载完了才吐出缓存页面那就等于没缓存一样。

但是问题来了!当你登陆之后,就会自动缓存登录状态,,这样其他用户访问的时候自动就是登陆的!

解决方法:

找到主题下的 comments.php 文件,删除登陆状态判断代码

<!--?php if ( $user_ID ) : ?-->
<!--?php endif; ?-->

每个主题都不一样,我这个主题这两句代码位置如下图:

这样,其他用户就不会显示登陆状态了

但是!还有一点,新的评论会因为缓存而需要等到缓存过期才能显示出来,而且不知道为什么,cache.php的缓存过期设置有时候不发挥作用,因此需要设置一个定时任务
简单粗暴

rm -rf /你网站的绝对路径/cache/*

至于多久删一次,就看你个人喜好了

本文基于《署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)》许可协议授权
转载原创文章请注明,转载自: 沧水的博客 » wordpress页面缓存静态化,优化提速100%!!
  1. cangshui

    这又是扒过来的不完整版emmm 我差点被炸了 这bug会保存你登录状态
    你在自己那登录管理员 其他人打开看到的也一样是管理员的 我搜索了其他作者的

    1. 沧水
      @cangshui 然而只会影响评论,并没有安全问题
    2. 沧水
      @cangshui 刚刚我更新解决了评论的登录状态问题
  2. 沧水

    ces 😳 啊

    1. 水妹
      @沧水 666水妹啊