搜尋
首頁後端開發php教程一个不错的PHP缓存类引见和PHP缓存函数介绍以及使用

一个不错的PHP缓存类介绍和PHP缓存函数介绍以及使用

缓存在实际使用当中应用很广泛,可以减轻对服务器数据库的访问,提高运行速度。目前很多CMS内容管理系统中频繁使用缓存机制来提高系统运行的效率。下面是一个写得不错的缓存类,可以参考下缓存的机制与写法。

cache.php 代码如下:

  /* 用户需要事先定义的常量: _CachePath_        模板缓存路径 _CacheEnable_        自动缓存机制是否开启,未定义或为空,表示关闭自动缓存机制 _ReCacheTime_        自动重新缓存间隔时间,单位为秒,未定义或为空,表示关闭自动重新缓存 */    class cache {	var $cachefile;  	var $cachefilevar;    	function cache() 	{          //生成当前页的Cache组文件名 $this->cachefilevar 及文件名 $this->cachefile          //动态页的参数不同对应的Cache文件也不同,但是每一个动态页的所有Cache文件都有相同的文件名,只是扩展名不同          $s=array(".","/");$r=array("_","");          $this->cachefilevar=str_replace($s,$r,$_SERVER["SCRIPT_NAME"])."_".$_GET[_ActionVar_];          $this->cachefile=$this->cachefilevar.".".md5($_SERVER["REQUEST_URI"]);  	}    	//删除当前页/模块的缓存  	function delete() 	{          //删除当前页的缓存          $d = dir(_CachePath_);          $strlen=strlen($this->cachefilevar);          //返回当前页的所有Cache文件组          while (false !== ($entry = $d->read())) 		{         		if (substr($entry,0,$strlen)==$this->cachefilevar) 			{             		if (!unlink(_CachePath_."/".$entry)) {echo "Cache目录无法写入";exit;}           	}       	}  	}    	//判断是否已Cache过,以及是否需要Cache  	function check() 	{          //如果设置了缓存更新间隔时间 _ReCacheTime_          if (_ReCacheTime_+0>0)		{         		//返回当前页Cache的最后更新时间           	[email protected](_CachePath_."/".$this->cachefilevar);$var=$var[0];           	//如果更新时间超出更新间隔时间则删除Cache文件         		if (time()-$var>_ReCacheTime_) 			{             		$this->delete();$ischage=true;           	}    		}          //返回当前页的Cache          $file=_CachePath_."/".$this->cachefile;          //判断当前页Cache是否存在 且 Cache功能是否开启          return (file_exists($file) and _CacheEnable_ and !$ischange);  	}    	//读取Cache  	function read() 	{      	//返回当前页的Cache          $file=_CachePath_."/".$this->cachefile;          //读取Cache文件的内容          if (_CacheEnable_) return readfile($file);          else return false;  	}    	//生成Cache  	function write($output) 	{          //返回当前页的Cache          $file=_CachePath_."/".$this->cachefile;          //如果Cache功能开启          if (_CacheEnable_) 		{            	//把输出的内容写入Cache文件         		[email protected]($file,'w');             	if ([email protected]($fp,$output)) {echo "模板Cache写入失败";exit;}             	@fclose($fp);             	//如果设置了缓存更新间隔时间 _ReCacheTime_            	if (_ReCacheTime_+0>0) 			{                 	//更新当前页Cache的最后更新时间               	$file=_CachePath_."/".$this->cachefilevar;                 	[email protected]($file,'w');                	if ([email protected]($fp,time())) {echo "Cache目录无法写入";exit;}               	@fclose($fp);            	}     		}  	}  }  ?>


 

 

类的使用:

<?php define("_CachePath_","./cache/");  	define("_CacheEnable_","1");  	define("_ReCacheTime_","43200");  	include('cache.php');  	$cache=new cache();  	if ($cache->check()) 	{  		$template=$cache->read();  	}	else 	{   		ob_start();       	ob_implicit_flush(0);  ?>  	页面内容。。。。  <?php $template = ob_get_contents();  		$cache->write($template);  	}  ?>  


 

 

 

PHP的缓存相关函数介绍

 

有些信息比方经常不变的,但是还是能变的信息放在缓存中以加快显示速度,这是很有价值的,所谓的缓存,通俗的理解就是一些保存在服务器端的共用信息。它是于服务器同生死的,我们在保存缓存的时候可以指定下次更新的时间的判断,比方要在5分钟更新一次,可以记录上次更新的时间,和当前时间比较,如果大于 5 分钟 ,读取数据库,更新换成,否则直接读取缓存数据,当然,缓存需要客户端用户激活的,只需一次。

ob_start()函数

ob_start()函数:打开输出缓冲区。

函数格式 void ob_start(void)

说明:当缓冲区激活时,所有来自PHP程序的非文件头信息均不会发送,而是保存在内部缓冲区。为了输出缓冲区的内容,可以使用ob_end_flush()或flush()输出缓冲区的内容。

flush()函数

函数格式:flush()

说明:这个函数经常使用,效率很高。

string ob_get_contents()函数

ob_get_contents :返回内部缓冲区的内容。

函数格式:string ob_get_contents(void)

说明:这个函数会返回当前缓冲区中的内容,如果输出缓冲区没有激活,则返回 FALSE。

ob_get_length()函数

ob_get_length:返回内部缓冲区的长度。

函数格式:int ob_get_length(void)

说明:这个函数会返回当前缓冲区中的长度;和ob_get_contents一样,如果输出缓冲区没有激活,则返回 FALSE。

ob_end_clean()函数

ob_end_clean:删除内部缓冲区的内容,并且关闭内部缓冲区。

函数格式:void ob_end_clean(void)

说明:这个函数不会输出内部缓冲区的内容而是把它删除。

ob_end_flush()函数

ob_end_flush:发送内部缓冲区的内容到浏览器,并且关闭输出缓冲区

函数格式:void ob_end_flush(void)

说明:这个函数发送输出缓冲区的内容(如果有的话)。

ob_implicit_flush()函数

函数格式:void ob_implicit_flush ([int flag])

说明:默认为关闭缓冲区,打开绝对输出后,每个脚本输出都直接发送到浏览器,不再需要调用 flush()。

PHP对静态页面的缓存技术研究

如果你的网站MySQL数据库的速度比较慢,你就需要看重网站的缓存了。用过 WordPress 的朋友都知道,它有一个插件叫 WP Super Cache, 可以将 WordPress 的页面在第一次生成时储存成静态页面,当再次请求这个页面时,就省去了读取数据库的时间。这里讨论的就是这种技术。

第一个问题就是怎样获取 PHP 输出的内容了。获取输出内容的原因很简单,因为我们可以把输出的内容储存起来,当访客再次光临的时候就把事先存好的内容给他。

实现这些目的其实也同样简单。我们只要把函数 ob_start() 在内容输出前调用,然后在所有内容输出完成后调用 ob_get_contents() 获取输出的内容,再在此后调用 ob_end_flush() 表示结束就可以了,一个简单的例子如下:

<?php ob_start(); ?><p>在 PHP 标签之外的输出可以被记录。</p><?php echo '<p>我被记录了。' ?><?php $cache = ob_get_contents(); ?><?php /* 在这里添加任何处理 $cache 的代码 */	echo $cache;?><?php ob_end_flush(); ?>


程序运行结果:

在 PHP 标签之外的输出可以被记录。我被记录了。在 PHP 标签之外的输出可以被记录。我被记录了。

      可见,$cache变量保存了之前的输出结果。就是说,我们可以通过cache来减少PHP的结果输出。

有时我们有这样的习惯,对于管理员是不启用缓存的,而对游客则启用缓存。这个时候,其实实现起来也比较简单。我们可以自己编写两个函数 cache($id) 和 end_cache($id),分别表示缓存开始和缓存结束,然后代码如下(这里有三个函数省略了):

<?phpfunction is_admin() {  /* 该函数用于测试当前用户是否是管理员,若是管理员则返回 true. */}function show_cache($id) {  /* 根据 $id 读取并显示缓存内容,若无缓存则返回 false. */}function save_cache($id, $content) {  /* 将标识符为 $id 的缓存,以内容 $content 储存。 */}function cache($id) {  if (is_admin())    return false;  if (show_cache($id))    return false;  ob_start();  return true;}function end_cache($id) {  if (is_admin())    return false;  save_cache($id, ob_get_contents());  ob_end_flush();  return true;}?>

有的时候,站点可能会根据需要,建立了专门为移动设备设计的页面。那么,这种情况下我们就应该将 $id 扩展一下。这种扩展有很多种方法,比如添加另一个参数,将移动设备的页面存在不同于桌面设备的文件夹中,而这些页面使用相同的 $id . 另外还有一种做法,就是将原来的 $id 与移动设备的 User-agent 糅合在一起,md5() 一下就可以了。我偏向于前面那种做法。当然肯定还有其它类似的做法,总之中心思想就是把缓存的标记 ($id) 设置成不一样的东西,并且当用户回来后还能区别得出它们,就可以了。

还有的时候,一个网站有多种用户角色,可能要给相应的用户相应的缓存。当然,只需遵循上面的原则。

ob_start() 和 ob_end_flush() 是递归处理的。也就是说,可以在调用 ob_end_flush() 之前,调用若干次 ob_start() . 例如:

有的时候,站点可能会根据需要,建立了专门为移动设备设计的页面。那么,这种情况下我们就应该将 $id 扩展一下。这种扩展有很多种方法,比如添加另一个参数,将移动设备的页面存在不同于桌面设备的文件夹中,而这些页面使用相同的 $id . 另外还有一种做法,就是将原来的 $id 与移动设备的 User-agent 糅合在一起,md5() 一下就可以了。我偏向于前面那种做法。当然肯定还有其它类似的做法,总之中心思想就是把缓存的标记 ($id) 设置成不一样的东西,并且当用户回来后还能区别得出它们,就可以了。

还有的时候,一个网站有多种用户角色,可能要给相应的用户相应的缓存。当然,只需遵循上面的原则。

ob_start() 和 ob_end_flush() 是递归处理的。也就是说,可以在调用 ob_end_flush() 之前,调用若干次 ob_start() . 例如:

<?phpob_start ();echo 'content1'.'<br />';ob_start();echo 'content2'.'<br>';$output1 = ob_get_contents(); echo $output1.'<br>';ob_end_flush();$output2 = ob_get_contents(); echo $output2.'<br>';ob_end_flush();?>

程序运行结果:

content1content2content2content1content2content2


 

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
华为GT3 Pro和GT4的差异是什么?华为GT3 Pro和GT4的差异是什么?Dec 29, 2023 pm 02:27 PM

许多用户在选择智能手表的时候都会选择的华为的品牌,其中华为GT3pro和GT4都是非常热门的选择,不少用户都很好奇华为GT3pro和GT4有什么区别,下面就就给大家介绍一下二者。华为GT3pro和GT4有什么区别一、外观GT4:46mm和41mm,材质是玻璃表镜+不锈钢机身+高分纤维后壳。GT3pro:46.6mm和42.9mm,材质是蓝宝石玻璃表镜+钛金属机身/陶瓷机身+陶瓷后壳二、健康GT4:采用最新的华为Truseen5.5+算法,结果会更加的精准。GT3pro:多了ECG心电图和血管及安

入职后,我才明白什么叫Cache入职后,我才明白什么叫CacheJul 31, 2023 pm 04:03 PM

事情其实是这样的,当时领导交给我一个perf硬件性能监视的任务,在使用perf的过程中,输入命令perf list,我看到了以下信息:我的任务就要让这些cache事件能够正常计数,但关键是,我根本不知道这些misses、loads是什么意思。

修复:截图工具在 Windows 11 中不起作用修复:截图工具在 Windows 11 中不起作用Aug 24, 2023 am 09:48 AM

为什么截图工具在Windows11上不起作用了解问题的根本原因有助于找到正确的解决方案。以下是截图工具可能无法正常工作的主要原因:对焦助手已打开:这可以防止截图工具打开。应用程序损坏:如果截图工具在启动时崩溃,则可能已损坏。过时的图形驱动程序:不兼容的驱动程序可能会干扰截图工具。来自其他应用程序的干扰:其他正在运行的应用程序可能与截图工具冲突。证书已过期:升级过程中的错误可能会导致此issu简单的解决方案这些适合大多数用户,不需要任何特殊的技术知识。1.更新窗口和Microsoft应用商店应用程

如何修复无法连接到iPhone上的App Store错误如何修复无法连接到iPhone上的App Store错误Jul 29, 2023 am 08:22 AM

第1部分:初始故障排除步骤检查苹果的系统状态:在深入研究复杂的解决方案之前,让我们从基础知识开始。问题可能不在于您的设备;苹果的服务器可能会关闭。访问Apple的系统状态页面,查看AppStore是否正常工作。如果有问题,您所能做的就是等待Apple修复它。检查您的互联网连接:确保您拥有稳定的互联网连接,因为“无法连接到AppStore”问题有时可归因于连接不良。尝试在Wi-Fi和移动数据之间切换或重置网络设置(“常规”>“重置”>“重置网络设置”>设置)。更新您的iOS版本:

使用cache可以提高计算机运行速度这是因为什么使用cache可以提高计算机运行速度这是因为什么Dec 09, 2020 am 11:28 AM

使用cache可以提高计算机运行速度这是因为Cache缩短了CPU的等待时间。Cache是位于CPU和主存储器DRAM之间,规模较小,但速度很高的存储器。Cache的功能是提高CPU数据输入输出的速率;Cache容量小但速度快,内存速度较低但容量大,通过优化调度算法,系统的性能会大大改善。

cache是什么存储器?cache是什么存储器?Nov 25, 2022 am 11:48 AM

cache叫做高速缓冲存储器,是介于中央处理器和主存储器之间的高速小容量存储器,一般由高速SRAM构成;这种局部存储器是面向CPU的,引入它是为减小或消除CPU与内存之间的速度差异对系统性能带来的影响。Cache容量小但速度快,内存速度较低但容量大,通过优化调度算法,系统的性能会大大改善。

nginx反向代理缓存教程。nginx反向代理缓存教程。Feb 18, 2024 pm 04:48 PM

以下是nginx反向代理缓存的教程:安装nginx:sudoaptupdatesudoaptinstallnginx配置反向代理:打开nginx配置文件:sudonano/etc/nginx/nginx.conf在http块中添加以下配置来启用缓存:http{...proxy_cache_path/var/cache/nginxlevels=1:2keys_zone=my_cache:10mmax_size=10ginactive=60muse_temp_path=off;proxy_cache

SpringBoot项目中怎么使用缓存CacheSpringBoot项目中怎么使用缓存CacheMay 16, 2023 pm 02:34 PM

前言缓存可以通过将经常访问的数据存储在内存中,减少底层数据源如数据库的压力,从而有效提高系统的性能和稳定性。我想大家的项目中或多或少都有使用过,我们项目也不例外,但是最近在review公司的代码的时候写的很蠢且low,大致写法如下:publicUsergetById(Stringid){Useruser=cache.getUser();if(user!=null){returnuser;}//从数据库获取user=loadFromDB(id);cahce.put(id,user);returnu

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

微軟推出的免費、功能強大的一款IDE編輯器