WordPress 纯代码实现纯静态

很早就得知张戈博客使用了纯静态,这也是张戈博客加载速度巨快的重要原因之一。

WordPress 中 wp super cache 和 cos html cache 这两款插件可以非常轻松地实现纯静态。但是本着能用纯代码就不用插件的原则,本文主要说明免插件实现纯静态的方法。

思路

在服务器中建立一个缓存目录,每次页面被访问,首先查看是否有缓存文件,如果有则直接返回缓存文件,否则将请求地址的 MD5 码作为文件名缓存 html 文件。并每隔一段时间删除相应的缓存。

细节

其实只是这样写的话会有很多小问题:

  1. 单个目录文件过多,影响性能。
  2. 动态请求也被缓存。

解决方法:

  1. 根据请求地址的 MD5 码的前两位将缓存文件分开,保证单个目录中的文件尽量得少。
  2. 只缓存 get 请求,如果不是 get 请求就删除缓存文件。

具体实现

设置缓存文件的目录,周期,扩展名,文件名。

Code   ViewPrint
  1. define('CACHE_ROOT', dirname(__FILE__).'/cache');     //缓存文件所在的目录
  2. define('CACHE_LIFE', 3600);                  //缓存文件的生命期,单位秒,86400秒是一天
  3. define('CACHE_SUFFIX','.html');             //缓存文件的扩展名,不能用 .php .asp .jsp .pl 等等
  4. $file_name  = md5($_SERVER['REQUEST_URI']).CACHE_SUFFIX;    //缓存文件名

根据md5的前两位把缓存文件分散开,避免文件过多

Code   ViewPrint
  1. $cache_dir  = CACHE_ROOT.'/'.substr($file_name,0,2);    //如果有必要,可以用第三四位为名,再加一层目录
  2. //尽量不要让单个目录多于1000,以免影响性能
  3. $cache_file = $cache_dir.'/'.$file_name;    //缓存文件存放路径

只缓存 get 请求并判断缓存文件是否存在

Code   ViewPrint
  1. if($_SERVER['REQUEST_METHOD']=='GET'){      //GET方式请求才缓存,POST之后一般都希望看到最新的结果
  2.     if(file_exists($cache_file) && time() - filemtime($cache_file) < CACHE_LIFE){   //如果缓存文件存在,并且没有过期,就把它读出来。
  3.         $fp = fopen($cache_file,'rb');
  4.         fpassthru($fp);
  5.         fclose($fp);
  6.         exit();
  7.     }
  8.     elseif(!file_exists($cache_dir)){
  9.         if(!file_exists(CACHE_ROOT)){
  10.             mkdir(CACHE_ROOT,0777);
  11.             chmod(CACHE_ROOT,0777);
  12.         }
  13.         mkdir($cache_dir,0777);
  14.         chmod($cache_dir,0777);
  15.     }
  16. }

回调函数

Code   ViewPrint
  1. function auto_cache($contents){         //回调函数,当程序结束时自动调用此函数
  2.     global $cache_file;
  3.     $fp = fopen($cache_file,'wb');
  4.     fwrite($fp,$contents);
  5.     fclose($fp);
  6.     chmod($cache_file,0777);
  7.     clean_old_cache();                  //生成新缓存的同时,自动删除所有的老缓存。以节约空间。
  8.     return $contents;
  9. }

自动删除旧的缓存

Code   ViewPrint
  1. function clean_old_cache(){
  2.     chdir(CACHE_ROOT);
  3.     foreach (glob("*/*".CACHE_SUFFIX) as $file){
  4.        if(time()-filemtime($file)>CACHE_LIFE){
  5.            unlink($file);
  6.        }
  7.     }
  8. }

完整步骤

第一步

将完整代码放到站点根目录下的 cache.php 中

完整代码点此下载:

第二步

在根目录中执行 'mkdir cache' 创建名为 cache 的目录

第三步

执行 'chmod -R 777 cache' 为 cache 目录赋予 777 权限

第四步

编辑站点根目录下的 index.php,在 <?php 的下一行添加代码:

require('cache.php');

完整代码

Code   ViewPrint
  1. <?php
  2. define('CACHE_ROOT', dirname(__FILE__).'/cache');
  3. define('CACHE_LIFE', 3600);                   //缓存文件的生命期,单位秒,86400秒是一天
  4. define('CACHE_SUFFIX','.html');             //缓存文件的扩展名,千万别用 .php .asp .jsp .pl 等等
  5. $file_name  = md5($_SERVER['REQUEST_URI']).CACHE_SUFFIX;    //缓存文件名
  6. //缓存目录,根据md5的前两位把缓存文件分散开。避免文件过多。如果有必要,可以用第三四位为名,再加一层目录。
  7. //256个目录每个目录1000个文件的话,就是25万个页面。两层目录的话就是65536*1000=六千五百万。
  8. //不要让单个目录多于1000,以免影响性能。
  9. $cache_dir  = CACHE_ROOT.'/'.substr($file_name,0,2);
  10. $cache_file = $cache_dir.'/'.$file_name;    //缓存文件存放路径
  11. if($_SERVER['REQUEST_METHOD']=='GET'){      //GET方式请求才缓存,POST之后一般都希望看到最新的结果
  12.     if(file_exists($cache_file) && time() - filemtime($cache_file) < CACHE_LIFE){   //如果缓存文件存在,并且没有过期,就把它读出来。
  13.         $fp = fopen($cache_file,'rb');
  14.         fpassthru($fp);
  15.         fclose($fp);
  16.         exit();
  17.     }
  18.     elseif(!file_exists($cache_dir)){
  19.         if(!file_exists(CACHE_ROOT)){
  20.             mkdir(CACHE_ROOT,0777);
  21.             chmod(CACHE_ROOT,0777);
  22.         }
  23.         mkdir($cache_dir,0777);
  24.         chmod($cache_dir,0777);
  25.     }
  26.     function auto_cache($contents){         //回调函数,当程序结束时自动调用此函数
  27.         global $cache_file;
  28.         $fp = fopen($cache_file,'wb');
  29.         fwrite($fp,$contents);
  30.         fclose($fp);
  31.         chmod($cache_file,0777);
  32.         clean_old_cache();                  //生成新缓存的同时,自动删除所有的老缓存。以节约空间。
  33.         return $contents;
  34.     }
  35.     function clean_old_cache(){
  36.         chdir(CACHE_ROOT);
  37.         foreach (glob("*/*".CACHE_SUFFIX) as $file){
  38.            if(time()-filemtime($file)>CACHE_LIFE){
  39.                unlink($file);
  40.            }
  41.         }
  42.     }
  43.     ob_start('auto_cache');                 //回调函数 auto_cache
  44. }
  45. else{
  46.     if(file_exists($cache_file)){           //file_exists() 函数检查文件或目录是否存在。
  47.         unlink($cache_file);                //不是GET的请求就删除缓存文件。
  48.     }
  49. }
  50. ?>

文件下载

zyq

如果我的文章对您有帮助,请我喝杯咖啡吧~

支付宝转账打赏⬆️

微信钱包转账打赏⬆️

目前评论:5   其中:访客  5   博主  0

  1. chanca 1

    这个功能 现在新版的还能适用么?

  2. http://fjxwl.com 0

    爷爷的院子里有一只大喇叭,每天把从全村搜集来的动物们凄惨的遭遇。放大后播放给院里的动物听:前院的猪被杀,后院的驴被阉,某流浪狗被打瘸。村北禽流感爆发 孙子问:这些事我们院里也有啊!怎么总播其他院的?爷爷:这有助于增加它们的幸福感

  3. http://iosxcode4.com 0

    公车上,一个满胳膊纹身的男坐在前面玩手机上车上了三个老太太。我让了个座,奶奶说了声谢谢。 马上那个男生也让了个座,老奶奶坐下以后也说谢谢。小伙子头都没抬说: 嗨,没事,跟我还客气你妈蛋埃 老太太的两条腿刚弯下去又直起来了

  4. http://shxfkt.com 0

    一个男青年,模仿国外电影里某角色,留着满脸大胡子,自以为美。为了交上女朋友,他在马路上主动帮助一位不相识的姑娘安装自行车链条。临别时,青年问:“你对我的印象怎么样?”姑娘答:“非常好,你这人真不简单,这么大年纪还上街来做好事! ”

  5. 韩国时尚购物起义 0

    花一块钱,就要发挥一块钱的100%的功效。

评论加载中...

发表评论

:?::razz::sad::evil::!::smile::oops::grin::eek::shock::???::cool::lol::mad::twisted::roll::wink::idea::arrow::neutral::cry::mrgreen: