0

0

PHP缓存原理及使用方法

php中文网

php中文网

发布时间:2016-06-21 08:52:41

|

1081人浏览过

|

来源于php中文网

原创

PHP由于它的强大和可伸缩性,近几年来得到长足的发展,PHP相比传统的ASP网站,在速度上有绝对的 优势,想mssql转6万条数据PHP如需要40秒,ASP不下2分钟.但是,由于网站的数据越来越多,我们渴求能更快速的调用数据,不必要每次都从数据 库掉,我们可以从其他的地方,比方一个文件,或者某个内存地址,这就是PHP的缓存技术,也就是Cache技术。

分析深入
一般来说,缓存的目的是把数据放在一个地方让访问的更快点,毫无疑问,内存是最快的,但是,几百M的数据能往内存放么?这不现实,当然,有的时 候临时放如服务器缓存,如ob_start()这个缓存页面开启的话在发送文件头之前页面内容都被缓存在内存中,知道等页面输出自动清楚或者等待 ob_get_contents的返回,或者被ob_end_clean显示的清除,这在静态页面的生成中能很好的利用,在模板中能得到很好的体现。
另外,在ASP中有一对象application,可以保存公用的参数,这也算点缓存,但在PHP,我至今没看到开发者产出这种对象,的确,没 必要.ASP.NET的页面缓存技术就用的是viewstate,而cache就是文件关联,(不一定准确),文件被修改,更新缓存,文件没被修改而且不 超时(注释1),就读取缓存,返回结果,就是这个思路,看看这个源码:

<ol class="dp-c"><li class="alt"><span><span><?PHP    </span></span></li><li><span>    <span class="keyword">class</span><span> cache{     </span></span></li><li class="alt"><span>    <span class="keyword">private</span><span> </span><span class="vars">$cache_dir</span><span>;     </span></span></li><li><span>    <span class="keyword">private</span><span> </span><span class="vars">$expireTime</span><span>=180;</span><span class="comment">//缓存的时间是 60 秒    </span><span> </span></span></li><li class="alt"><span>    <span class="keyword">function</span><span> __construct(</span><span class="vars">$cache_dirname</span><span>){     </span></span></li><li><span>     <span class="keyword">if</span><span>(!@</span><span class="func">is_dir</span><span>(</span><span class="vars">$cache_dirname</span><span>)){     </span></span></li><li class="alt"><span>      <span class="keyword">if</span><span>(!@</span><span class="func">mkdir</span><span>(</span><span class="vars">$cache_dirname</span><span>,0777)){     </span></span></li><li><span>      <span class="vars">$this</span><span>->warn(</span><span class="string">'缓存文件不存在而且不能创建,需要手动创建.'</span><span>);     </span></span></li><li class="alt"><span>      <span class="keyword">return</span><span> false;     </span></span></li><li><span>      }     </span></li><li class="alt"><span>     }     </span></li><li><span>    <span class="vars">$this</span><span>->cache_dir = </span><span class="vars">$cache_dirname</span><span>;     </span></span></li><li class="alt"><span>    }     </span></li><li><span>    <span class="keyword">function</span><span> __destruct(){     </span></span></li><li class="alt"><span>     <span class="func">echo</span><span> </span><span class="string">'Cache class bye.'</span><span>;     </span></span></li><li><span>    }     </span></li><li class="alt"><span>        </span></li><li><span>    <span class="keyword">function</span><span> get_url() {     </span></span></li><li class="alt"><span>            <span class="keyword">if</span><span> (!isset(</span><span class="vars">$_SERVER</span><span>[</span><span class="string">'REQUEST_URI'</span><span>])) {     </span></span></li><li><span>                    <span class="vars">$url</span><span> = </span><span class="vars">$_SERVER</span><span>[</span><span class="string">'REQUEST_URI'</span><span>];     </span></span></li><li class="alt"><span>            }<span class="keyword">else</span><span>{     </span></span></li><li><span>                    <span class="vars">$url</span><span> = </span><span class="vars">$_SERVER</span><span>[</span><span class="string">'SCRIPT_NAME'</span><span>];     </span></span></li><li class="alt"><span>                    <span class="vars">$url</span><span> .= (!emptyempty(</span><span class="vars">$_SERVER</span><span>[</span><span class="string">'QUERY_STRING'</span><span>])) ? </span><span class="string">'?'</span><span> . </span><span class="vars">$_SERVER</span><span>[</span><span class="string">'QUERY_STRING'</span><span>] : </span><span class="string">''</span><span>;     </span></span></li><li><span>            }     </span></li><li class="alt"><span>        </span></li><li><span>            <span class="keyword">return</span><span> </span><span class="vars">$url</span><span>;     </span></span></li><li class="alt"><span>    }    </span></li><li><span>    <span class="keyword">function</span><span> warn(</span><span class="vars">$errorstring</span><span>){   </span></span></li><li class="alt"><span>    <span class="func">echo</span><span> </span><span class="string">"<b><font color='red'>发生错误:<pre class="brush:php;toolbar:false;">"</span><span>.</span><span class="vars">$errorstring</span><span>.</span><span class="string">"
";   
  •     }   
  •       
  •     function cache_page($pageurl,$pagedata){   
  •      if(!$fso=fopen($pageurl,'w')){   
  •       $this->warns('无法打开缓存文件.');//trigger_error   
  •       return false;   
  •      }   
  •      if(!flock($fso,LOCK_EX)){//LOCK_NB,排它型锁定   
  •       $this->warns('无法锁定缓存文件.');//trigger_error   
  •       return false;   
  •      }   
  •      if(!fwrite($fso,$pagedata)){//写入字节流,serialize写入其他格式   
  •       $this->warns('无法写入缓存文件.');//trigger_error   
  •       return false;   
  •      }   
  •      flock($fso,LOCK_UN);//释放锁定   
  •      fclose($fso);   
  •      return true;   
  •     }   
  •       
  •     function display_cache($cacheFile){   
  •                 if(!file_exists($cacheFile)){   
  •         $this->warn('无法读取缓存文件.');//trigger_error   
  •         return false;   
  •                 }   
  •        echo '读取缓存文件:'.$cacheFile;   
  •     //return unserialize(file_get_contents($cacheFile));   
  •             $fso = fopen($cacheFile'r');   
  •             $data = fread($fsofilesize($cacheFile));   
  •             fclose($fso);   
  •      return $data;   
  •     }   
  •       
  •     function readData($cacheFile='default_cache.txt'){   
  •      $cacheFile = $this->cache_dir."/".$cacheFile;   
  •      if(file_exists($cacheFile)&&filemtime($cacheFile)>(time()-$this->expireTime)){   
  •       $data=$this->display_cache($cacheFile);   
  •       }else{   
  •        $data="from here wo can get it from mysql database,update time is ".date('l dS \of F Y h:i:s A').",过期时间是:".date('l dS \of F Y h:i:s A',time()+$this->expireTime)."----------";   
  •        $this->cache_page($cacheFile,$data);   
  •      }   
  •       return $data;   
  •     }   
  •     }   
  •     ?>  


  • PHP速学教程(入门到精通)
    PHP速学教程(入门到精通)

    PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

    下载

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

    热门AI工具

    更多
    DeepSeek
    DeepSeek

    幻方量化公司旗下的开源大模型平台

    豆包大模型
    豆包大模型

    字节跳动自主研发的一系列大型语言模型

    通义千问
    通义千问

    阿里巴巴推出的全能AI助手

    腾讯元宝
    腾讯元宝

    腾讯混元平台推出的AI助手

    文心一言
    文心一言

    文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

    讯飞写作
    讯飞写作

    基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

    即梦AI
    即梦AI

    一站式AI创作平台,免费AI图片和视频生成。

    ChatGPT
    ChatGPT

    最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

    相关专题

    更多
    pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
    pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

    本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

    928

    2026.02.13

    微博网页版主页入口与登录指南_官方网页端快速访问方法
    微博网页版主页入口与登录指南_官方网页端快速访问方法

    本专题系统整理微博网页版官方入口及网页端登录方式,涵盖首页直达地址、账号登录流程与常见访问问题说明,帮助用户快速找到微博官网主页,实现便捷、安全的网页端登录与内容浏览体验。

    307

    2026.02.13

    Flutter跨平台开发与状态管理实战
    Flutter跨平台开发与状态管理实战

    本专题围绕Flutter框架展开,系统讲解跨平台UI构建原理与状态管理方案。内容涵盖Widget生命周期、路由管理、Provider与Bloc状态管理模式、网络请求封装及性能优化技巧。通过实战项目演示,帮助开发者构建流畅、可维护的跨平台移动应用。

    183

    2026.02.13

    TypeScript工程化开发与Vite构建优化实践
    TypeScript工程化开发与Vite构建优化实践

    本专题面向前端开发者,深入讲解 TypeScript 类型系统与大型项目结构设计方法,并结合 Vite 构建工具优化前端工程化流程。内容包括模块化设计、类型声明管理、代码分割、热更新原理以及构建性能调优。通过完整项目示例,帮助开发者提升代码可维护性与开发效率。

    29

    2026.02.13

    Redis高可用架构与分布式缓存实战
    Redis高可用架构与分布式缓存实战

    本专题围绕 Redis 在高并发系统中的应用展开,系统讲解主从复制、哨兵机制、Cluster 集群模式及数据分片原理。内容涵盖缓存穿透与雪崩解决方案、分布式锁实现、热点数据优化及持久化策略。通过真实业务场景演示,帮助开发者构建高可用、可扩展的分布式缓存系统。

    103

    2026.02.13

    c语言 数据类型
    c语言 数据类型

    本专题整合了c语言数据类型相关内容,阅读专题下面的文章了解更多详细内容。

    54

    2026.02.12

    雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法
    雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法

    本专题系统整理雨课堂网页版官方入口及在线登录方式,涵盖账号登录流程、官方直连入口及平台访问方法说明,帮助师生用户快速进入雨课堂在线教学平台,实现便捷、高效的课程学习与教学管理体验。

    17

    2026.02.12

    豆包AI网页版入口与智能创作指南_官方在线写作与图片生成使用方法
    豆包AI网页版入口与智能创作指南_官方在线写作与图片生成使用方法

    本专题汇总豆包AI官方网页版入口及在线使用方式,涵盖智能写作工具、图片生成体验入口和官网登录方法,帮助用户快速直达豆包AI平台,高效完成文本创作与AI生图任务,实现便捷智能创作体验。

    764

    2026.02.12

    PostgreSQL性能优化与索引调优实战
    PostgreSQL性能优化与索引调优实战

    本专题面向后端开发与数据库工程师,深入讲解 PostgreSQL 查询优化原理与索引机制。内容包括执行计划分析、常见索引类型对比、慢查询优化策略、事务隔离级别以及高并发场景下的性能调优技巧。通过实战案例解析,帮助开发者提升数据库响应速度与系统稳定性。

    92

    2026.02.12

    热门下载

    更多
    网站特效
    /
    网站源码
    /
    网站素材
    /
    前端模板

    精品课程

    更多
    相关推荐
    /
    热门推荐
    /
    最新课程
    MIP文档手册
    MIP文档手册

    共47课时 | 31.4万人学习

    YMP在线手册
    YMP在线手册

    共64课时 | 45.4万人学习

    Excel 教程
    Excel 教程

    共162课时 | 18.4万人学习

    关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
    php中文网:公益在线php培训,帮助PHP学习者快速成长!
    关注服务号 技术交流群
    PHP中文网订阅号
    每天精选资源文章推送

    Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号