実際の使用ではキャッシュが広く使用されており、サーバーデータベースへのアクセスを減らし、動作速度を向上させることができます。現在、多くの CMS コンテンツ管理システムは、システム運用の効率を向上させるためにキャッシュ メカニズムを頻繁に使用しています。以下はよく書かれたキャッシュクラスです。キャッシュの仕組みと書き方を参照してください。
cache.php コードは次のとおりです:
リーリー
クラスの使用法:
リーリー
一部の情報 (多くの場合は一定ですが変更される可能性がある情報) は、表示を高速化するためにキャッシュに保存されます。これは、サーバー側に保存される共有情報であると一般的に理解されています。キャッシュを保存するときに、次の更新の時間を指定できます。たとえば、5 分ごとに更新したい場合は、最後の更新の時間を記録し、それと比較できます。現在時刻が 5 分を超えている場合は、データベースを読み取り、更新します。それ以外の場合は、キャッシュされたデータを直接読み取ります。もちろん、キャッシュはクライアント ユーザーによってアクティブ化される必要があり、アクティブ化する必要があるのは 1 回だけです。
ob_start() 関数: 出力バッファを開きます。
関数形式 void ob_start(void)
注: バッファーがアクティブ化されると、PHP プログラムからのファイル以外のヘッダー情報はすべて送信されず、内部バッファーに保存されます。バッファの内容を出力するには、ob_end_flush() または flash() を使用してバッファの内容を出力します。
関数形式: flash()
説明: この関数は頻繁に使用され、非常に効率的です。
ob_get_contents: 内部バッファの内容を返します。
関数の形式: string ob_get_contents(void)
説明: この関数は、出力バッファがアクティブ化されていない場合、現在のバッファの内容を返します。FALSE を返します。
ob_get_length: 内部バッファの長さを返します。
関数形式: int ob_get_length(void)
説明: この関数は、ob_get_contents と同様に、現在のバッファーの長さを返します。出力バッファーがアクティブ化されていない場合は、FALSE を返します。
ob_end_clean: 内部バッファの内容を削除し、内部バッファを閉じます。
関数形式: void ob_end_clean(void)
説明: この関数は内部バッファの内容を出力せずに削除します。
ob_end_flush: 内部バッファの内容をブラウザに送信し、出力バッファを閉じます
関数形式: void ob_end_flush(void)
説明: この関数は、出力バッファーの内容 (存在する場合) を送信します。
関数の形式: void ob_implicit_flush ([int flag])
注: バッファはデフォルトでオフになっており、絶対出力をオンにすると、各スクリプト出力はブラウザに直接送信されるため、flush() を呼び出す必要はありません。
Web サイトの MySQL データベースが比較的遅い場合は、Web サイトのキャッシュに注意する必要があります。 WordPress を使用したことのある友人は、WP Super Cache というプラグインがあることを知っています。このプラグインを使用すると、WordPress ページが最初に生成されたときに静的ページとして保存でき、データベースの読み取り時間を節約できます。ここで説明するのはこのテクニックです。
最初の質問は、PHP によって出力されたコンテンツを取得する方法です。出力コンテンツを取得する理由は単純で、出力コンテンツを保存しておき、訪問者が再び来たときに事前に保存されたコンテンツを提供できるからです。
これらの目標を達成することも実際には同様に簡単です。コンテンツが出力される前に関数 ob_start() を呼び出し、すべてのコンテンツが出力された後に ob_get_contents() を呼び出して出力コンテンツを取得し、次に ob_end_flush() を呼び出して終了を示すだけです。簡単な例は次のとおりです。 :
リーリー
プログラムの実行結果:
$cache 変数が以前の出力結果を保存していることがわかります。つまり、キャッシュを介して出力されるPHPの結果を削減することができます。
管理者に対してはキャッシュを有効にせず、訪問者に対してはキャッシュを有効にするという習慣が時々あります。現時点では、実際には実装は比較的簡単です。それぞれキャッシュの開始とキャッシュの終了を表す 2 つの関数、cache($id) と end_cache($id) を自分で書くことができ、コードは次のようになります (ここでは 3 つの関数が省略されています):
<?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