设为首页 收藏本站
查看: 541|回复: 0

[经验分享] PHP缓存应用代码

[复制链接]

尚未签到

发表于 2017-3-23 09:54:48 | 显示全部楼层 |阅读模式
  再有2个月就该庆祝自己参加工作3年整了,也是自己运用php3年整了,经常自省自己的技术实力:在一些方面还存在不足,所以就写了这篇博客,自己也是在网上抄的望大家不要见笑,现在很多网站都运用了缓存技术,自己在这方面还有不足的地方,前几天在工作中老大教了一点感觉受用了虽然代码不多当然很感谢他了;下面是我自己在网上找的一些实例也算是初步实际了解了缓存的机制了,博客的原文地址是:http://blog.sina.com.cn/s/blog_780d4de70100xin1.html
  // 首先建立cache文件 (运行后部分代码有注释结果)
  class cache {
    private $dir;
    private $lifetime;
    private $cacheid;
    private $ext;
   
    function __construct($dir='',$lifetime='') {
        if ($this->dir_isvalid($dir)) {  //  $dir cache/
            $this->dir = $dir;
            $this->lifetime = $lifetime;  // 10
            $this->ext = '.Php';
            $this->cacheid = $this->getcacheid(); 
  // $this->getcacheid(): cache/003d47a2f66c6d7f0f05a18243ca162c.php
        }
    }
   
    private function isvalid() {
        if (!file_exists($this->cacheid)) return false;
        if (!(@$mtime = filemtime($this->cacheid))) return false;
        if (mktime() - $mtime > $this->lifetime) return false;
        return true;
    }
   
    public function write($mode=0,$content='') {
        switch ($mode) {       // int(0)
            case 0:
                $content = ob_get_contents();
  
                /*var_dump($content);exit;
                string(112) "time123hahhah:13:16:33 20th April
                time3456hahha:13:16:33 20th April*/ 
  
                break;
            default:
                break;
        }
        ob_end_flush();  // 冲刷出(送出)输出缓冲区内容并关闭缓冲
        try {
            file_put_contents($this->cacheid,$content);  // 将字符串写入文件
        }
        catch (Exception $e) {
            $this->error('写入缓存失败!请检查目录权限!');
        }
    }
   
    public function load() {   // 程序貌似没走到这个函数
        if ($this->isvalid()) { //var_dump('111');exit;
            echo "<span style='display:;'>This is Cache.</span> ";
            //以下两种方式,哪种方式好?????
            require_once($this->cacheid);
            //echo file_get_contents($this->cacheid);
            exit();
        }
        else { //var_dump('222');exit; ++
            ob_start();
        }
    }
   
    public function clean() {    // 这个函数是清除缓存文件的
        try {
            unlink($this->cacheid);   删除  cache/003d47a2f66c6d7f0f05a18243ca162c.php缓存文件
        }
        catch (Exception $e) {
            $this->error('清除缓存文件失败!请检查目录权限!');
        }
    }
    private function getcacheid() {
        return $this->dir.md5($this->geturl()).$this->ext; 
  // cache/003d47a2f66c6d7f0f05a18243ca162c.php
    }
   
    private function dir_isvalid($dir) {
        if (is_dir($dir)) return true;
        try {
            mkdir($dir,0777);   // 缓存文件不存在就mkdir
        }
        catch (Exception $e) {
            $this->error('所设定缓存目录不存在并且创建失败!请检查目录权限!');
            return false;
        }
        return true;
    }
   
    private function geturl() {
        $url = '';
        if (isset($_SERVER['REQUEST_URI'])) {
            $url = $_SERVER['REQUEST_URI'];
        }
        else {
            $url = $_SERVER['Php_SELF'];
            $url .= empty($_SERVER['QUERY_STRING'])?'':'?'.$_SERVER['QUERY_STRING'];
        }
        return $url;
    }
   
    private function error($str) {
        echo '<div style="color:red;">'.$str.'</div>';
    }

}
  // 在建立  test.php文件
  require_once('cache.php');
        $cachedir = 'cache/'; //设定缓存目录
        $cache = new Cache($cachedir,10); //省略参数即采用缺省设置, $cache = new Cache($cachedir);
        if ($_GET['cacheact'] != 'rewrite') //此处为一技巧,通过xx.Php?cacheact=rewrite更新缓存,以此类推,还可以设定一些其它操作
            $cache->load(); //装载缓存,缓存有效则不执行以下页面代码
        //页面代码开始
        echo $time = "第一个缓存字符串:".date('H:i:s jS F',time()).'<br/>';
        echo $time2 = "第二个缓存字符串:".date('H:i:s jS F',time()).'<br/>';
        echo '<a href="?cacheact=rewrite">更新</a>';
        //页面代码结束
        $cache->write(); //首次运行或缓存过期,生成缓存
       
        //$cache->write(1,$time2); //只缓存$time部分的数据
  // 在浏览器里输入http://localhost/test/ztest.php  可能会有错但不用担心
  // 运行结果:
  Notice: Undefined index: cacheact in D:\wamp_php\wamp\www\test\ztest.php on line 11
Strict Standards: mktime(): You should be using the time() function instead in D:\wamp_php\wamp\www\test\cache.php on line 20
第一个缓存字符串:13:51:00 20th April
第二个缓存字符串:13:51:00 20th April
更新
  // 生成的缓存文件是:
  cache\003d47a2f66c6d7f0f05a18243ca162c.Php
  /* 第一个缓存字符串:13:31:26 20th April<br/>第二个缓存字符串:13:31:26 20th April<br/><a href="?cacheact=rewrite">更新</a> */
  cache\834bf560e67a566ef08efa0df269894e.Php
  /* 第一个缓存字符串:13:51:00 20th April<br/>第二个缓存字符串:13:51:00 20th April<br/><a href="?cacheact=rewrite">更新</a> */
  // 这里报了两个错误 ,点击链接 更新 (http://localhost/test/ztest.php?cacheact=rewrite) ,错误是因为你没有传入参数 cacheact ,点击 更新 链接 就不会报错了;
  当你更改 test.php 里的$time和$time2的内容的时候 点击 更新链接 cache\003d47a2f66c6d7f0f05a18243ca162c.Php缓存的文件内容会更新成你更改后的内容 但是 cache\834bf560e67a566ef08efa0df269894e.Php的内容却还是原来的没有被改变。
  这个问题你来回答吧
  // 这个函数就是自己写的那个缓存应用(thinkphp框架下写的)
  public function choicedatedata($choiceTime){
        $cacheName = 'laterdatedata_'.$choiceTime;  // laterdatedata_2014-03-16
        $ret = cache($cacheName);
        if(!$ret){
           
            $sql = "select count(0) as a from edl_login_game_log where DATE_FORMAT(CreateTime,'%Y-%m-%d') = '".$choiceTime."' and Username not in (select UserName from edl_login_game_log where DATE_FORMAT(CreateTime,'%Y-%m-%d')< '".$choiceTime."' group by UserName) group by UserName";
            $ret = $this->query($sql);
            cache($cacheName,$ret);
        }
        return $ret;
    }

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-353933-1-1.html 上篇帖子: tpl_grid_display.php 下篇帖子: PHP验证码应用,示例
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表