PHP は、コード キャッシュ テクノロジを実装するためにファイル データ キャッシュを実装します。ページにアクセスするたびに、まず対応するキャッシュが存在するかどうかを検出し、存在しない場合はデータベースに接続し、データを取得し、テンプレート変数の割り当てを完了します。ページを表示し、同時にキャッシュ ファイルを生成します。そのため、次回アクセスするときにキャッシュされたファイルが機能します。ファイル データ キャッシュの実装コードを実装するには、ページにアクセスするたびに実行されます。対応するキャッシュが存在するかどうかを最初に検出し、存在しない場合は、データベース チュートリアル に接続し、データを取得し、テンプレート変数の割り当てを完了し、ページを表示し、同時にキャッシュ ファイルを生成します。キャッシュファイルは次回アクセスしたときから有効になり、ifブロックのデータクエリ文は実行されません。もちろん、有効期間の設定やキャッシュグループの設定など、実際に使用する際には考慮すべき点はたくさんあります
クラスcacheException extends例外{}
/**
* キャッシュ抽象クラス
*/
抽象クラスcache_abstract {
/**
*/
抽象パブリック関数fetch($key);
/**
* キャッシュ変数
*
* @param string $key キャッシュ変数の添字
* @param string $value キャッシュ変数の値
* @return bool
*/
抽象パブリック関数store($key, $value);
/**
* キャッシュ変数の削除
*
* @param string $key キャッシュの添え字
*/
抽象パブリック関数 delete($key);
/**
* すべてのキャッシュをクリア(削除)します
*/
抽象パブリック関数clear();
/**
*/
抽象パブリック関数 lock($key);
/**
*/
抽象パブリック関数unlock($key);
/**
*キャッシュ変数がロックされているかどうかを取得します
*
* @param string $ keyキャッシュ添え
*/
抽象パブリック関数 islocked($key);
/**
*
- ‐ ‐ - ‐-- - - - - 、 - を使用して使用します。*/
public function checklock($key) {
if (!$this->islocked($key)) {
return $this;
}
$tries = 10;
$count = 0;
do {
usleep(200);
$count ++;
} while ($count islocked($key)); // 最做十次睡眠等待機解锁,超時则跳过并解锁
$this->islocked($key) && $this->unlock($key);
$this を返します。
}
}
/**&#&*/
CLASSCACHE_APCextends cache_abstract {
protected $_prefix = 'cache.mjie.net';
public function __construct() {
if (!function_exists('apc_cache_info')) {
throw new cacheException('apc 拡張機能がインストールされていません');
}
}
/**
* キャッシュ変数の保存
*
* @param string $key
* @parammixed $value
* @return bool
*/
public function store($key, $value) {
return apc_store($this->_storagekey($key), $value);
}
/**
* 読み取りキャッシュ
*
* @param string $key
* @returnmixed
*/
public function fetch($key) {
return apc_fetch($this->_storagekey($key));
}
/**
*/
パブリック関数 clear() {
apc_clear_cache();
$this を返します。
}
/**
*/
public function delete($key) {
apc_delete($this->_storagekey($key));
$this を返します。
}
/**
*/
public function islocked($key) {
if ((apc_fetch($this->_storagekey($key) . '.lock')) === false) {
false を返します。
}
trueを返します。
}
/**
* キャッシュユニットのロック
*
* @param string $key
* @return cache_apc
*/
public function lock($key) {
apc_store($this->_storagekey($key) . '.lock', '', 5);
$this を返します。
}
/**
* キャッシュユニットのロック解除
*/
public functionunlock($key) {
apc_delete($this->_storagekey($key) . '.lock');
$this を返します。
}
/**
* 完全なキャッシュ名
*
* @param string $key
* @return string
*/
プライベート関数 _storagekey($key) {
return $this->_prefix . '_' 。 $キー;
}
}
/**
* 文件缓存实现
*
*
* @category mjie
* @package キャッシュ
* @author 流水孟春
* @copyright copyright (c) 2008-
* @license 新しい bsd ライセンス
* @version $id:cache/file.php バージョン番号 2010-04-18 16:46 cmpan $
*/
class queue_file extends cache_abstract {
public $usesubdir = false;
protected $_cachesdir = 'キャッシュ';
public function __construct() {
if (define('data_dir')) {
$this->_setcachedir(data_dir . '/cache');
}
}
/**
* キャッシュ ファイルを取得します
*
* @param string $key*/
protected function _getcachefile($key) {
$subdir = $this->usesubdir ? substr($key, 0, 2) 。 '/' : '';
$this->_cachesdir を返します。 '/' 。 $サブディレクトリ 。 $key 。 '.php';
}
/**
* キャッシュ変数を読み取ります
* 情報漏洩を防ぐため、キャッシュ ファイルの形式は「」で始まります
混合
*/
public function fetch($key) {
$cachefile = self::_getcachefile($key);
if (file_exists($cachefile) && is_readable($cachefile)) {
// include 方式
// return include $cachefile;
// 系列化方式
return unserialize(@file_get_contents($cachefile, false, null, 13));
}
false を返します。
}
/**
* キャッシュ変数
* 情報漏洩を防ぐため、キャッシュファイルの形式は「」で始まるphpファイルとなっています
$value キャッシュ変数の値
* @return bool
*/
public function store($key, $value) {
$cachefile = self::_getcachefile($key);
$cachedir = dirname($cachefile);
if(!is_dir($cachedir)) {
if(!@mkdir($cachedir, 0755, true)) {
スロー新しいキャッシュ例外("キャッシュディレクトリを作成できませんでした");
}
}
// include 方式
//return @file_put_contents($cachefile, '
return @file_put_contents($cachefile, '' .serialize($value));
}
/**
* 删除缓存变量
*
* @param string $key 缓存下标
* @return Cache_file
*/
public function delete($key) {
if(emptyempty($key)) {
throw new queueException("missing argument 1 for queue_file::delete()");
}
$cachefile = self::_getcachefile($key);
if(!@unlink($cachefile)) {
throw new cacheException("キャッシュ ファイルを削除できませんでした");
}
$this を返します。
}
/**
_*/
public function islocked($key) {
$cachefile = self::_getcachefile($key);
clearstatcache();
return file_exists($cachefile . '.lock');
}
/**
* 锁定
*
* @param string $key
* @return cache_file
*/
public function lock($key) {
$cachefile = self::_getcachefile($key);
$cachedir = dirname($cachefile);
if(!is_dir($cachedir)) {
if(!@mkdir($cachedir, 0755, true)) {
if(!is_dir($cachedir)) {
throw new cacheException(「キャッシュ ディレクトリを作成できませんでした」 );
}
}}}}
//
$this を返します。
}
/**
* 解锁
*
* @param string $key
* @return cache_file
*/
public functionunlock($key) {
$cachefile = self::_getcachefile($key);
@unlink($cachefile . '.lock');
戻る
次の項を見てsmartyの保存文件例番号
再度見るsmartyが提供する页面缓存機能:
1
2require(' Smarty.class.php') ;
3$smarty = new Smarty;
4$smarty->caching = true; 5if(!$smarty->is_cached('index.tpl')) { 6 // 利用可能なキャッシュはありません, ここで変数の代入を行います。 ; 11?>php缓存技术動作時、当程序查询データ的時、会擊的結果序列化後文件保存,後同样的查询语句是可以不使用直接查询データベース库この変更により、プログラムの実行速度が大幅に向上します。