目錄
PHP的缓存相关函数介绍
PHP对静态页面的缓存技术研究
首頁 php教程 php手册 一个不错的PHP缓存类介绍和PHP缓存函数介绍以及使用

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

Jun 13, 2016 am 09:37 AM
函數 快取

缓存在实际使用当中应用很广泛,可以减轻对服务器数据库的访问,提高运行速度。目前很多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的最后更新时间  
         	$var=@file(_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文件  
       		$fp=@fopen($file,'w');  
           	if (!@fputs($fp,$output)) {echo "模板Cache写入失败";exit;}  
           	@fclose($fp);  
           	//如果设置了缓存更新间隔时间 _ReCacheTime_  
          	if (_ReCacheTime_+0>0) 
			{  
               	//更新当前页Cache的最后更新时间  
             	$file=_CachePath_."/".$this->cachefilevar;  
               	$fp=@fopen($file,'w');  
              	if (!@fwrite($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>我被记录了。</p>' ?>

<?php $cache = ob_get_contents(); ?>
<?php
	/* 在这里添加任何处理 $cache 的代码 */
	echo $cache;
?>

<?php ob_end_flush(); ?>
登入後複製


程序运行结果:

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

在 PHP 标签之外的输出可以被记录。
我被记录了。
登入後複製

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

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

<?php

function 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() . 例如:

<?php
ob_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();
?>
登入後複製

程序运行结果:

content1
content2
content2

content1
content2
content2
登入後複製


本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡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 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
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教學
1669
14
CakePHP 教程
1428
52
Laravel 教程
1329
25
PHP教程
1273
29
C# 教程
1256
24
golang函數動態建立新函數的技巧 golang函數動態建立新函數的技巧 Apr 25, 2024 pm 02:39 PM

Go語言提供了兩種動態函數創建技術:closures和反射。 closures允許存取閉包作用域內的變量,而反射可使用FuncOf函數建立新函數。這些技術在自訂HTTP路由器、實現高度可自訂的系統和建置可插拔的元件方面非常有用。

C++ 函數命名中參數順序的考慮 C++ 函數命名中參數順序的考慮 Apr 24, 2024 pm 04:21 PM

在C++函數命名中,考慮參數順序至關重要,可提高可讀性、減少錯誤並促進重構。常見的參數順序約定包括:動作-物件、物件-動作、語意意義和遵循標準函式庫。最佳順序取決於函數目的、參數類型、潛在混淆和語言慣例。

excel函數公式大全 excel函數公式大全 May 07, 2024 pm 12:04 PM

1. SUM函數,用於對一列或一組單元格中的數字進行求和,例如:=SUM(A1:J10)。 2、AVERAGE函數,用於計算一列或一組儲存格中的數字的平均值,例如:=AVERAGE(A1:A10)。 3.COUNT函數,用於計算一列或一組單元格中的數字或文字的數量,例如:=COUNT(A1:A10)4、IF函數,用於根據指定的條件進行邏輯判斷,並返回相應的結果。

如何在Java中寫出高效和可維護的函數? 如何在Java中寫出高效和可維護的函數? Apr 24, 2024 am 11:33 AM

編寫高效且可維護的Java函數的關鍵在於:保持簡潔。使用有意義的命名。處理特殊情況。使用適當的可見性。

C++ 函式異常進階:客製化錯誤處理 C++ 函式異常進階:客製化錯誤處理 May 01, 2024 pm 06:39 PM

C++中的異常處理可透過自訂異常類別增強,提供特定錯誤訊息、上下文資訊以及根據錯誤類型執行自訂操作。定義繼承自std::exception的異常類,提供特定的錯誤訊息。使用throw關鍵字拋出自訂異常。在try-catch區塊中使用dynamic_cast將捕獲到的異常轉換為自訂異常類型。在實戰案例中,open_file函數會拋出FileNotFoundException異常,捕捉並處理該異常可提供更具體的錯誤訊息。

如何在 Golang 分散式系統中使用快取? 如何在 Golang 分散式系統中使用快取? Jun 01, 2024 pm 09:27 PM

在Go分布式系统中,可使用groupcache包实现缓存,该包提供了一个通用的缓存接口,支持多种缓存策略,如LRU、LFU、ARC和FIFO。利用groupcache可显著提高应用程序性能,减少后端负载,并增强系统的可靠性。具体实现方式如下:导入必要包设置缓存池大小定义缓存池设置缓存失效时间设置并发取值请求数处理取值请求结果

PHP開發中的快取機制與應用實戰 PHP開發中的快取機制與應用實戰 May 09, 2024 pm 01:30 PM

在PHP開發中,快取機制透過將經常存取的資料暫時儲存在記憶體或磁碟中來提升效能,從而減少資料庫存取次數。快取類型主要包括記憶體、檔案和資料庫快取。 PHP中可以使用內建函數或第三方函式庫實作緩存,如cache_get()和Memcache。常見的實戰應用程式包括快取資料庫查詢結果以最佳化查詢效能,以及快取頁面輸出以加快渲染速度。快取機制有效改善網站回應速度,提升使用者體驗並降低伺服器負載。

Golang 函數接收 map 參數時的注意事項 Golang 函數接收 map 參數時的注意事項 Jun 04, 2024 am 10:31 AM

在Go中傳遞map給函數時,預設會建立副本,對副本的修改不影響原map。如果需要修改原始map,可透過指標傳遞。空map需小心處理,因為技術上是nil指針,傳遞空map給期望非空map的函數會發生錯誤。

See all articles