热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

详细讲解PHP中缓存技术的应用,讲解php缓存技术

php教程|php手册phpphp教程-php手册详细讲解PHP中缓存技术的应用,讲解php缓存技术积分礼品源码,vscode多行怎么设置,如何更新ubuntu,TOMCAT下载音

php教程|php手册详细讲解PHP中缓存技术的应用,讲解php缓存技术
php
php教程-php手册
详细讲解PHP中缓存技术的应用,讲解php缓存技术
积分礼品 源码,vscode多行怎么设置,如何更新ubuntu,TOMCAT下载音乐教案,手机sqlite3安装教程,爬虫识别相似图片并爬取,php开发的优势,简历中seo怎么写,手机网站管理系统,个人用户中心模板lzw
PHP,一门最近几年兴起的web设计脚本语言,由于它的强大和可伸缩性,近几年来得到长足的发展,php相比传统的asp网站,在速度上有绝对的优势,想mssql转6万条数据php如需要40秒,asp不下2分钟.但是,由于网站的数据越来越多,我们渴求能更快速的调用数据,不必要每次都从数据库掉,我们可以从其他的地方,比方一个文件,或者某个内存地址,这就是php的缓存技术,也就是Cache技术.
微赞同城信息源码,vscode 运行c 代码,ubuntu界面程序,tomcat解决占用,查询sqlite数据的语句,前端三大框架面试题及答案,织物上面的小爬虫是什么,php 时间 8,湘西seo优化标题,网站素材 按钮,热血网页源码,bootstrap cms 模板lzw
一般来说,缓存的目的是把数据放在一个地方让访问的更快点,毫无疑问,内存是最快的,但是,几百M的数据能往内存放么?这不现实,当然,有的时候临时放如服务器缓存,如ob_start()这个缓存页面开启的话在发送文件头之前页面内容都被缓存在内存中,知道等页面输出自动清楚或者等待ob_get_contents的返回,[或者被ob_end_clean显示的清除,这在静态页面的生成中能很好的利用,在模板中能得到很好的体现,我的这篇文章深入的讨论了:
论坛社区app源码,vscode跳转定义不好用,ubuntu 16 pxe,tomcat出现5个,爬虫双温控,汽车之家 php,浙江策划型seo有哪些品牌lzw
谈PHP生成静态页面,这是一种方式,但这是临时性的,不是解决我们问题的好方法.

另外,在asp中有一对象application,可以保存公用的参数,这也算点缓存,但在php,我至今没看到开发者产出这种对象,的确,没必要.asp.net的页面缓存技术就用的是viewstate,而cache就是文件关联,(不一定准确),文件被修改,更新缓存,文件没被修改而且不超时(注释1),就读取缓存,返回结果,就是这个思路,看看这个源码:

classcache{
/*
ClassName:cache
Description:controltocachedata,$cache_out_timeisaarraytosavecachedatetimeout.
Version:1.0
Author:老农cjjer
Lastmodify:2006-2-26
AuthorURL:http://www.cjjer.com
*/
private$cache_dir;
private$expireTime=180;//缓存的时间是60秒
function__construct($cache_dirname){
if(!@is_dir($cache_dirname)){
if(!@mkdir($cache_dirname,0777)){
$this->warn(”缓存文件不存在而且不能创建,需要手动创建.”);
returnfalse;
}
}
$this->cache_dir=$cache_dirname;
}
function__destruct(){
echo”Cacheclassbye.”;
}
functionget_url(){
if(!isset($_SERVER[”REQUEST_URI”])){
$url=$_SERVER[”REQUEST_URI”];
}else{
$url=$_SERVER[”SCRIPT_NAME”];
$url.=(!empty($_SERVER[”QUERY_STRING”]))?”?”.$_SERVER[”QUERY_STRING”]:””;
}
return$url;
}
functionwarn($errorstring){
echo”发生错误:

".$errorstring."

“;
}
functioncache_page($pageurl,$pagedata){
if(!$fso=fopen($pageurl,”w”)){
$this->warns(”无法打开缓存文件.”);//trigger_error
returnfalse;
}
if(!flock($fso,LOCK_EX)){//LOCK_NB,排它型锁定
$this->warns(”无法锁定缓存文件.”);//trigger_error
returnfalse;
}
if(!fwrite($fso,$pagedata)){//写入字节流,serialize写入其他格式
$this->warns(”无法写入缓存文件.”);//trigger_error
returnfalse;
}
flock($fso,LOCK_UN);//释放锁定
fclose($fso);
returntrue;
}
functiondisplay_cache($cacheFile){
if(!file_exists($cacheFile)){
$this->warn(”无法读取缓存文件.”);//trigger_error
returnfalse;
}
echo”读取缓存文件:”.$cacheFile;
//returnunserialize(file_get_contents($cacheFile));
$fso=fopen($cacheFile,”r”);
$data=fread($fso,filesize($cacheFile));
fclose($fso);
return$data;
}
functionreadData($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=”fromherewocangetitfrommysqldatabase,updatetimeis“.date(”ldSofFYh:i:sA”).”,过期时间是:”.date(”ldSofFYh:i:sA”,time()+$this->expireTime).”———-“;
$this->cache_page($cacheFile,$data);
}
return$data;
}

}
?>

下面我打断这个代码逐行解释.

三:程序透析

这个缓存类(类没什么好怕的.请继续看)名称是cache,有2个属性:

private$cache_dir;
private$expireTime=180;

$cache_dir是缓存文件所放的相对网站目录的父目录,$expireTime(注释一)是我们缓存的数据过期的时间,主要是这个思路:

当数据或者文件被加载的时候,先判断缓存文件存在不,返回false,文件最后修改时间和缓存的时间和比当前时间大不,大的话说明缓存还没到期,小的话返回false,当返回false的时候,读取原始数据,写入缓存文件中,返回数据.,

接着看程序:

function__construct($cache_dirname){
if(!@is_dir($cache_dirname)){
if(!@mkdir($cache_dirname,0777)){
$this->warn(”缓存文件不存在而且不能创建,需要手动创建.”);
returnfalse;
}
}
$this->cache_dir=$cache_dirname;
}

当类第一次被实例的时候构造默认函数带参数缓存文件名称,如文件不存在,创建一个有编辑权限的文件夹,创建失败的时候抛出异常.然后把cache类的$cache_dir属性设置为这个文件夹名称,我们的所有缓存文件都是在这个文件夹下面的.

function__destruct(){
echo”Cacheclassbye.”;
}

这是class类的析构函数,为了演示,我们输出一个字符串表示我们释放cache类资源成功.

functionwarn($errorstring){
echo”发生错误:

".$errorstring."

“;
}

这个方法输出错误信息.

functionget_url(){
if(!isset($_SERVER[”REQUEST_URI”])){
$url=$_SERVER[”REQUEST_URI”];
}else{
$url=$_SERVER[”SCRIPT_NAME”];
$url.=(!empty($_SERVER[”QUERY_STRING”]))?”?”.$_SERVER[”QUERY_STRING”]:””;
}
return$url;
}

这个方法返回当前url的信息,这是我看国外很多人的cms系统这样做,主要是缓存x.php?page=1,x.php?page=2,等这种文件的,这里列出是为了扩展的这个cache类功能的.

functioncache_page($pageurl,$pagedata){
if(!$fso=fopen($pageurl,”w”)){
$this->warns(”无法打开缓存文件.”);//trigger_error
returnfalse;
}
if(!flock($fso,LOCK_EX)){//LOCK_NB,排它型锁定
$this->warns(”无法锁定缓存文件.”);//trigger_error
returnfalse;
}
if(!fwrite($fso,$pagedata)){//写入字节流,serialize写入其他格式
$this->warns(”无法写入缓存文件.”);//trigger_error
returnfalse;
}
flock($fso,LOCK_UN);//释放锁定
fclose($fso);
returntrue;
}

cache_page方法分别传入的是缓存的文件名称和数据,这是把数据写到文件里的方法,先用fopen打开文件,然后调用句柄锁定这个文件,然后用fwrite写入文件,最后释放这个句柄,任何一步发生错误将抛出错误.您可能看到这个注释

写入字节流,serialize写入其他格式

,顺便一提的是如果我们要把一个数组,(可以从MySQL数据库里面select查询除了的结果)用serialize函数写入,用unserialize读取到原来的类型.

functiondisplay_cache($cacheFile){
if(!file_exists($cacheFile)){
$this->warn(”无法读取缓存文件.”);//trigger_error
returnfalse;
}
echo”读取缓存文件:”.$cacheFile;
//returnunserialize(file_get_contents($cacheFile));
$fso=fopen($cacheFile,”r”);
$data=fread($fso,filesize($cacheFile));
fclose($fso);
return$data;
}

这是由文件名称读取缓存的方法,直接打开文件,读取全部,如果文件不存在的或者无法读取的话返回false,当然,你感到不人性的话,可以重新生成缓存.

functionreadData($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=”fromherewocangetitfrommysqldatabase,updatetimeis“.date(”ldSofFYh:i:sA”).”,过期时间是:”.date(”ldSofFYh:i:sA”,time()+$this->expireTime).”———-“;
$this->cache_page($cacheFile,$data);
}
return$data;
}

这个函数是我们调用的方法,可以写成接口的方法,由传入参数判断文件存在不,文件最后修改时间+expireTime的时间是不是过了当前时间(大于的话说明没有过期),如果文件不存在或者已经过期,重新加载原始数据,这里,为了简单期间,我们是直接源是字符串,您可以把cache类继承某类,取到数据库的数据.(注释2)

四:补充说明,结语 

注释一:这个缓存的时间您可以自己调,可以根据时间情况读取数组,xml,缓存等,请按照您的方便,值得一提的是缓存的时间(也就是缓存的key)也用缓存控制,.这在cms系统中被广泛使用,他们把要更新的key放在缓存中,非常容易控制全战.

注释二:php5开始支持类继承,这是让人兴奋的,把网站全局休息写在一个配置的类里面,再写与数据层交互的类(如与MySQL交互的类),我们的这个cache类继承数据交互的类,可以非常容易的读取数据库,这是外话,此处不再展开,有时间和大家详谈.

特别说明,这个类文件针对的php5以上版本,其他版本的请不要使用类.

转载自:http://www.aspnetjia.com


推荐阅读
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 自己用过的一些比较有用的css3新属性【HTML】
    web前端|html教程自己用过的一些比较用的css3新属性web前端-html教程css3刚推出不久,虽然大多数的css3属性在很多流行的浏览器中不支持,但我个人觉得还是要尽量开 ... [详细]
  • 云计算的优势与应用场景
    本文详细探讨了云计算为企业和个人带来的多种优势,包括成本节约、安全性提升、灵活性增强等。同时介绍了云计算的五大核心特点,并结合实际案例进行分析。 ... [详细]
  • JavaScript 中创建对象的多种方法
    本文详细介绍了 JavaScript 中创建对象的几种常见方式,包括对象字面量、构造函数和 Object.create 方法,并提供了示例代码和属性描述符的解释。 ... [详细]
  • PHP 编程疑难解析与知识点汇总
    本文详细解答了 PHP 编程中的常见问题,并提供了丰富的代码示例和解决方案,帮助开发者更好地理解和应用 PHP 知识。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 深入理解 SQL 视图、存储过程与事务
    本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ... [详细]
  • 深入解析 Apache Shiro 安全框架架构
    本文详细介绍了 Apache Shiro,一个强大且灵活的开源安全框架。Shiro 专注于简化身份验证、授权、会话管理和加密等复杂的安全操作,使开发者能够更轻松地保护应用程序。其核心目标是提供易于使用和理解的API,同时确保高度的安全性和灵活性。 ... [详细]
  • PHP插件机制的实现方案解析
    本文深入探讨了PHP中插件机制的设计与实现,旨在分享一种可行的实现方式,并邀请读者共同讨论和优化。该方案不仅涵盖了插件机制的基本概念,还详细描述了如何在实际项目中应用。 ... [详细]
  • 从 .NET 转 Java 的自学之路:IO 流基础篇
    本文详细介绍了 Java 中的 IO 流,包括字节流和字符流的基本概念及其操作方式。探讨了如何处理不同类型的文件数据,并结合编码机制确保字符数据的正确读写。同时,文中还涵盖了装饰设计模式的应用,以及多种常见的 IO 操作实例。 ... [详细]
  • 本文详细介绍了如何在Ubuntu系统中下载适用于Intel处理器的64位版本,涵盖了不同Linux发行版对64位架构的不同命名方式,并提供了具体的下载链接和步骤。 ... [详细]
  • 本文介绍如何通过SSH协议使用Xshell远程连接到Ubuntu系统。为了实现这一目标,需要确保Ubuntu系统已安装并配置好SSH服务器,并保证网络连通性。 ... [详细]
  • 本文探讨了如何在日常工作中通过优化效率和深入研究核心技术,将技术和知识转化为实际收益。文章结合个人经验,分享了提高工作效率、掌握高价值技能以及选择合适工作环境的方法,帮助读者更好地实现技术变现。 ... [详细]
  • 探讨了如何解决Ajax请求响应时间过长的问题。本文分析了一个从服务器获取少量数据的Ajax请求,尽管服务器已经对JSON响应进行了缓存,但实际响应时间仍然不稳定。 ... [详细]
author-avatar
百度地震姜常宏
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有