展开目录
缓存才是优化的终极手段
缓存优化
X
陈尼玛的博客
记录开发生涯的踩坑经历,用时间来验证成长
加载中

企业的网站,通常一个页面就会包含各种数据列表,也就需要各种数据库查询。即使是再快的查询,堆积在一起的时间也可能会很长。我遇到过最夸张的情况,已经达到了5秒以上的加载时间。

优化查询语句是不可能的,这种时候只能牺牲绝对的实时性,复杂的列表段代码启用缓存。

以下是php的缓存类代码:

<?php
/**
 author: treemonster
 date: 2017-08-16
 <http://treemonster.github.io/>
 */
class Cache {

  private static $_id;
  private static $_is_begin=false;

  private static function getdir($s){
    return '/tmp/'.$s;
  }
  static function begin($seconds,$id){
    if(self::$_is_begin)throw new Exception("must call end() before next cache begin!");
    self::$_id=md5($id);
    $fn=self::getdir(self::$_id.'.cache');
    $fd=self::getdir(self::$_id.'.cache.time');
    if(file_exists($fn) && file_get_contents($fd)*1+$seconds>time()){
      echo file_get_contents($fn);
      return true;
    }
    self::$_is_begin=true;
    ob_start();
  }
  static function end(){
    if(!self::$_is_begin)throw new Exception("must call begin() before end cache!");
    self::$_is_begin=false;
    $id=self::$_id;
    $fn=self::getdir($id.'.cache');
    $fd=self::getdir($id.'.cache.time');
    $data=ob_get_contents();
    ob_end_clean();
    file_put_contents($fn, $data);
    file_put_contents($fd, time());
    echo $data;
  }

}

使用时在需要缓存的内容段前后增加begin()end()的调用,例如:

其他代码

<?php if(Cache::begin(600,'index.page.cache')): ?>

<?php

// 一大堆很慢的代码
sleep(4);
echo '当前缓存:'.time();

?>

<?php Cache::end(); endif; ?>

其他代码

这段代码的意义是,第一次运行(无缓存情况下),等待4秒后,输出当前缓存:时间戳,并把输出的结果加入肯德基豪华午餐缓存,缓存名为index.page.cache,之后的10分钟内任何访问,都会直接返回缓存中的内容。

这样一来缓存有效期内的得到的内容就可以输出文件内容,而不需要去运行里面很慢的代码。

相关文档

暂无

随便看看

  1. windows电脑防止自动休眠

  2. 记一次nodejs内存泄漏的排查经历

  3. css多行文本超出截断显示省略号

  4. react项目webpack打包时拆分异步加载的文件

  5. word文件命令行打印

  6. pip安装nltk临时使用国内源

  7. css3 文字渐变色

  8. curl用法

  9. SSL certificate problem: self signed certificate in certificate chain

  10. ios13 vpn 能连接但不能传数据问题解决

  11. jxa运动指令脚本

  12. git删除远程分支

  13. heroku查看app使用时间

  14. 模拟307跳转情况

  15. ie8上Image.onload不触发问题

  16. bootstrap modal弹框导致ie无法获取焦点

  17. 数据库清理优化

  18. youku电脑版跳过广告代码

  19. 配置mysql ssl连接

畅言模块加载中