PHPでよく見られるキャッシュ技術の実例分析

4975 ワード

この例では、PHPで一般的なキャッシュ技術を分析します.皆さんの参考にしてください.具体的には以下の通りです.
JBLOGは開発の過程で、性能の最適化に対して多くの仕事をしました.不要なデータベース・クエリーを最小限に抑えるために、いくつかのデータをキャッシュおよび静的に処理しました.
キャッシュの原理:よく使われるが、変更が少ないデータを配列や他の形式で独立したPHPファイルに格納し、必要に応じて含める.
キャッシュの利点:データベースのクエリー回数を大幅に減らし、データベースの圧力を軽減し、プログラムの実行効率を高めることができます.
JBLOGキャッシュのデータには、システム設定、ブログ分類、サイドバー最新ログ、最新コメント、ブログ統計、ログアーカイブ、友情リンク、ラベルなどがあります.これらのデータをキャッシュすることで,ページデータベースを1回実行するクエリの回数を十数回から3回に減らす.
JBLOGのキャッシュに関する関数はincludeディレクトリの下にあるcache.func.phpでは、主な関数:

//    
function recache($cachestr = '') {
if (!$cachestr) {
 $cachelist = array('config','class','archive','newcomment','newpost','link','tag','statistic','topblog');
} else {
 $cachelist = explode(',',$cachestr);
 foreach ($cachelist as $cache) {
  $cachename = $cache.'_recache';
  if (function_exists($cachename)) {
  $cachename();
  }
 }
}
}


recache()関数はキャッシュをリフレッシュするために使用され、各キャッシュは独立した関数で存在し、キャッシュをリフレッシュするときに対応する関数を1回実行するだけでよい.

//        
function writeToFile($cachename,$content = '') {
$allowcache = $cachelist = array('config','class','archive','newcomment','newpost','link','tag','statistic','topblog');
if (in_array($cachename,$allowcache)) {
 $cache_dir = JBLOG_ROOT.'cache_data/';
 $cache_file_name = $cache_dir.'cache_'.$cachename.'.php';
 if (!is_dir($cache_dir)) {
  @mkdir($cache_dir,0777);
 }
 if ($fp = @fopen($cache_file_name,'wb')) {
  $content = "//               ,    \r
// :".date('Y-m-d H:i:s',time())."\r
\r
if (!defined('IN_JBLOG')) {exit('Access Denied!');}\r
\r
".$content."\r
\r
??>"; @fwrite($fp,$content); @fclose(); @chmod($cache_file_name,0777); } else { echo ' '.$cache_dir.$cache_file_name.'
'; } } else { die(' '.$cachename.' !'); } }

writeToFile()関数は、キャッシュ・ディレクトリにデータを書き込んでcache_キャッシュ名php名前のファイルにあります.具体的なキャッシュ関数の例を見てみましょう.

//      
function class_recache() {
global $db,$tablepre;
$content = '';
$sql = "SELECT id,classname,description,orderid,arcnum FROM `{$tablepre}class` ORDER BY orderid";
$result = $db->query($sql);
while ($row = $db->fetch_array($result)) {
 $content .= "\tarray(\r
"; $content .= "\t'id'=>'".addslashes($row['id'])."',\r
"; $content .= "\t'classname'=>'".addslashes($row['classname'])."',\r
"; $content .= "\t'description'=>'".addslashes($row['description'])."',\r
"; $content .= "\t'orderid'=>'".addslashes($row['orderid'])."',\r
"; $content .= "\t'arcnum'=>'".addslashes($row['arcnum'])."',\r
"; $content .= "\t),\r
"; } $content = substr($content,0,strrpos($content,',')); $content = "\$class_cache = array(\r
{$content}\r
);"; writeToFile('class',$content); }

class_recache()関数はデータベースからデータを取り出し、分類IDを配列のインデックスとし、カテゴリの情報を対応する値として、データのアクセスを容易にする配列を構築します.キャッシュの導入:
すべてのキャッシュデータはincludeディレクトリの下のcommonに統一されている.inc.php導入、コードは以下の通りです.

//        ,          
if ([email=!@include(JBLOG_ROOT.]!@include(JBLOG_ROOT.'cache_data/cache_config.php'[/email])) {
require_once(JBLOG_ROOT.'include/cache.func.php');
recache('config');
exit('            ,     !');
}
//    ,            
$cachestr = '';
$cachelist = array('class','archive','newcomment','newpost','link','tag','statistic','topblog');
foreach ($cachelist as $cachename) {
$cachestr .= (@include(JBLOG_ROOT.'cache_data/cache_'.$cachename.'.php')) ? '' : $cachename.',';
}
$cachestr = substr($cachestr,0,strrpos($cachestr,','));
if ($cachestr) {
require_once(JBLOG_ROOT.'include/cache.func.php');
recache($cachestr);
exit('        ,     !');
}
unset($cachelist,$cachename,$cachestr);

まず構成情報をロードするのは、他のキャッシュファイルを作成する際に、システムの設定情報を使用することが多いためです.システム設定に最新ログの数をカスタマイズできるオプションがあり、最新ログをキャッシュするときにこの変数が使用されるため、構成情報が正常にキャッシュされたことを確認してから、他のアイテムをキャッシュする必要があります.
本稿で述べたphpプログラム設計に役立つことを願っています.