目錄
PHP的缓存相关函数介绍
ob_start()函数
flush()函数
string ob_get_contents()函数
ob_get_length()函数
ob_end_clean()函数
ob_end_flush()函数
ob_implicit_flush()函数
PHP对静态页面的缓存技术研究
首頁 後端開發 php教程 一个不错的PHP缓存类引见和PHP缓存函数介绍以及使用

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

Jun 13, 2016 am 11:54 AM
cache gt quot

一个不错的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

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

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

熱門話題

Java教學
1664
14
CakePHP 教程
1423
52
Laravel 教程
1318
25
PHP教程
1269
29
C# 教程
1248
24
華為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 入職後,我才明白什麼叫Cache Jul 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應用程式商店應用程

使用cache可以提高計算機運行速度這是因為什麼 使用cache可以提高計算機運行速度這是因為什麼 Dec 09, 2020 am 11:28 AM

使用cache可以提高電腦運行速度這是因為Cache縮短了CPU的等待時間。 Cache是​​位於CPU和主記憶體DRAM之間,規模較小,但速度很高的記憶體。 Cache的功能是提高CPU資料輸入輸出的速率;Cache容量小但速度快,記憶體速度較低但容量大,透過最佳化調度演算法,系統的效能會大幅提升。

cache、rom、ram的特徵是什麼 cache、rom、ram的特徵是什麼 Aug 26, 2022 pm 04:05 PM

cache的特性:在CPU與主記憶體之間設定的一級或兩級高速小容量記憶體,其資訊是隨著電腦的斷電自然遺失。 ROM的特性:只能從記憶體讀取數據,而不能往裡面寫訊息,電腦斷電後數據仍然存在。 ram的特點:既可以從記憶體讀取數據,也可以到記憶體中寫入資訊;用於存放運行程式所需的命令、程式和資料等;電腦斷電後資訊自然遺失。

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專案中怎麼使用快取Cache SpringBoot專案中怎麼使用快取Cache May 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

cache是​​什麼記憶體? cache是​​什麼記憶體? Nov 25, 2022 am 11:48 AM

cache叫做高速緩衝記憶體,是介於中央處理器與主記憶體之間的高速小容量記憶體,一般由高速SRAM構成;這種局部記憶體是面向CPU的,引進它是為減少或消除CPU與記憶體之間的速度差異對系統性能帶來的影響。 Cache容量小但速度快,記憶體速度較低但容量大,透過最佳化調度演算法,系統的效能會大幅提升。

See all articles