目次
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 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

golang 関数で新しい関数を動的に作成するためのヒント golang 関数で新しい関数を動的に作成するためのヒント Apr 25, 2024 pm 02:39 PM

Go 言語は、クロージャとリフレクションという 2 つの動的関数作成テクノロジを提供します。クロージャを使用すると、クロージャ スコープ内の変数にアクセスでき、リフレクションでは FuncOf 関数を使用して新しい関数を作成できます。これらのテクノロジーは、HTTP ルーターのカスタマイズ、高度にカスタマイズ可能なシステムの実装、プラグイン可能なコンポーネントの構築に役立ちます。

C++ 関数の命名におけるパラメーターの順序に関する考慮事項 C++ 関数の命名におけるパラメーターの順序に関する考慮事項 Apr 24, 2024 pm 04:21 PM

C++ 関数の名前付けでは、読みやすさを向上させ、エラーを減らし、リファクタリングを容易にするために、パラメーターの順序を考慮することが重要です。一般的なパラメータの順序規則には、アクション-オブジェクト、オブジェクト-アクション、意味論的な意味、および標準ライブラリへの準拠が含まれます。最適な順序は、関数の目的、パラメーターの種類、潜在的な混乱、および言語規約によって異なります。

Java で効率的で保守しやすい関数を記述するにはどうすればよいでしょうか? Java で効率的で保守しやすい関数を記述するにはどうすればよいでしょうか? Apr 24, 2024 am 11:33 AM

効率的で保守しやすい Java 関数を作成するための鍵は、シンプルに保つことです。意味のある名前を付けてください。特殊な状況に対処します。適切な可視性を使用してください。

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 関数。指定された条件に基づいて論理的な判断を行い、結果を返すために使用されます。対応する結果。

PHP 開発におけるキャッシュ メカニズムとアプリケーションの実践 PHP 開発におけるキャッシュ メカニズムとアプリケーションの実践 May 09, 2024 pm 01:30 PM

PHP 開発では、キャッシュ メカニズムにより、頻繁にアクセスされるデータがメモリまたはディスクに一時的に保存され、データベース アクセスの数が削減され、パフォーマンスが向上します。キャッシュの種類には主にメモリ、ファイル、データベース キャッシュが含まれます。キャッシュは、組み込み関数またはサードパーティのライブラリ (cache_get() や Memcache など) を使用して PHP に実装できます。一般的な実用的なアプリケーションには、データベース クエリ結果をキャッシュしてクエリ パフォーマンスを最適化したり、ページ出力をキャッシュしてレンダリングを高速化したりすることが含まれます。キャッシュ メカニズムにより、Web サイトの応答速度が効果的に向上し、ユーザー エクスペリエンスが向上し、サーバーの負荷が軽減されます。

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 などの複数のキャッシュ戦略をサポートします。グループキャッシュを活用すると、アプリケーションのパフォーマンスが大幅に向上し、バックエンドの負荷が軽減され、システムの信頼性が向上します。具体的な実装方法は以下の通りです。必要なパッケージのインポート、キャッシュプールサイズの設定、キャッシュプールの定義、キャッシュ有効期限の設定、同時値リクエスト数の設定、値リクエスト結果の処理を行います。

Golang関数がマップパラメータを受け取る際の注意点 Golang関数がマップパラメータを受け取る際の注意点 Jun 04, 2024 am 10:31 AM

Go の関数にマップを渡すと、デフォルトでコピーが作成され、コピーへの変更は元のマップには影響しません。元のマップを変更する必要がある場合は、ポインタを介してそれを渡すことができます。空のマップは技術的には nil ポインターであり、空ではないマップを期待する関数に空のマップを渡すとエラーが発生するため、空のマップは慎重に扱う必要があります。

See all articles