ホームページ > php教程 > php手册 > PHP キャッシュ テクノロジの実装

PHP キャッシュ テクノロジの実装

WBOY
リリース: 2016-06-21 08:52:02
オリジナル
1102 人が閲覧しました

APC およびファイル キャッシュを実装する PHP キャッシュ実装を送信します。 Cache_Abstract を継承することで、サードパーティのキャッシュ ツールを呼び出すことができます。

shindigのキャッシュクラスとapcを参照してください。

PHP コード

class CacheException は例外 {}

を拡張します

/**

* キャッシュ抽象クラス

​*/

抽象クラス Cache_Abstract {

/**

* キャッシュ変数の読み取り

*

* @param string $key キャッシュのサブスクリプト

* @return 混合

​*/

抽象パブリック関数 fetch($key);

/**

* キャッシュ変数

*

* @param string $key キャッシュ変数の添字

* @param string $value キャッシュ変数の値

* @return bool

​*/

抽象パブリック関数ストア($key, $value);

/**

* キャッシュ変数を削除

*

* @param string $key キャッシュのサブスクリプト

* @return Cache_Abstract

​*/

抽象パブリック関数 delete($key);

/**

* すべてのキャッシュをクリア (削除)

*

* @return Cache_Abstract

​*/

抽象パブリック関数 clear();

/**

* ロックキャッシュ変数

*

* @param string $key キャッシュのサブスクリプト

* @return Cache_Abstract

​*/

抽象パブリック関数ロック($key);

/**

* キャッシュ変数のロックを解除します

*

* @param string $key キャッシュのサブスクリプト

* @return Cache_Abstract

​*/

抽象パブリック関数unlock($key);

/**

* キャッシュ変数がロックされているかどうかを取得

*

* @param string $key キャッシュのサブスクリプト

* @return bool

​*/

抽象パブリック関数 isLocked($key);

/**

* ロックされていないことを確認してください

* ロック解除を待機するために最大 $tries 回スリープし、タイムアウトになったらスキップしてロックを解除します

*

* @param string $key キャッシュのサブスクリプト

​*/

パブリック関数 checkLock($key) {

if (!$this->isLocked($key)) {

$this を返す;

}

$tries = 10;

$count = 0;

{

をしてください

usleep(200);

$count++;

} while ($count <= $tries && $this->isLocked($key)); // ロック解除を待機するために最大 10 回スリープし、タイムアウトになったらスキップしてロックを解除します

$this->isLocked($key) && $this->unlock($key);

$this を返す;

}

}

/**

* APC 拡張キャッシュの実装

*

*

* @category Mjie

* @package キャッシュ

* @著者Liu Shui Meng Chun

* @copyright Copyright (c) 2008-

* @license 新しい BSD ライセンス

* @version $Id: Cache/Apc.php バージョン番号 2010-04-18 23:02 cmpan $

​*/

class Cache_Apc extends Cache_Abstract {

protected $_prefix = 'cache.mjie.net';

パブリック関数 __construct() {

if (!function_exists('apc_cache_info')) {

throw new CacheException('apc 拡張機能がインストールされていません');

}

}

/**

* キャッシュ変数を保存

*

* @param string $key

* @param 混合 $value

* @return bool

​*/

パブリック関数ストア($key, $value) {

return apc_store($this->_storageKey($key), $value);

}

/**

* 読み取りキャッシュ

*

* @param string $key

* @return 混合

​*/

パブリック関数 fetch($key) {

return apc_fetch($this->_storageKey($key));

}

/**

* キャッシュをクリア

*

* @return Cache_Apc

​*/

パブリック関数 clear() {

apc_clear_cache();

$this を返します;

}

/**

* キャッシュユニットを削除

*

* @return Cache_Apc

​*/

パブリック関数 delete($key) {

apc_delete($this->_storageKey($key));

$this を返す;

}

/**

* キャッシュユニットがロックされているかどうか

*

* @param string $key

* @return bool

​*/

パブリック関数 isLocked($key) {

  if ((apc_fetch($this->_storageKey($key) . '.lock')) === false) {

  false を返します;

  }

  true を返します;

  }

  /**

* ロックキャッシュユニット

*

* @param string $key

* @return Cache_Apc

​*/

  パブリック関数ロック($key) {

  apc_store($this->_storageKey($key) . '.lock', '', 5);

  $this を返す;

  }

  /**

* キャッシュユニットのロックが解除されました

*

* @param string $key

* @return Cache_Apc

​*/

  パブリック関数のロック解除($key) {

  apc_delete($this->_storageKey($key) . '.lock');

  $this を返す;

  }

  /**

*完全なキャッシュ名

*

* @param string $key

* @戻り文字列

​*/

  プライベート関数 _storageKey($key) {

  $this->_prefix を返します。 '_' 。 $key;

  }

  }

  /**

* ファイルキャッシュの実装

*

*

* @category Mjie

* @package キャッシュ

* @著者Liu Shui Meng Chun

* @copyright Copyright (c) 2008- (at)qq.com>

* @license 新しい BSD ライセンス

* @version $Id: Cache/File.php のバージョン番号 2010-04-18 16:46 cmpan $

​*/

  class Cache_File extends Cache_Abstract {

  public $useSubdir = false;

  protected $_cachesDir = 'キャッシュ';

  パブリック関数 __construct() {

  if (定義済み('DATA_DIR')) {

  $this->_setCacheDir(DATA_DIR . '/cache');

  }

  }

  /**

* キャッシュファイルを取得

*

* @param string $key

* @戻り文字列

​*/

  保護された関数 _getCacheFile($key) {

  $subdir = $this->useSubdir ? substr($key, 0, 2) 。 '/' : '';

  $this->_cachesDir を返します。 '/' 。 $サブディレクトリ 。 $key 。 '.php';

  }

  /**

* キャッシュ変数の読み取り

※情報漏洩防止のため、キャッシュファイルの形式は「"

」で始まるphpファイルとなります。

*

* @param string $key キャッシュのサブスクリプト

* @return 混合

​*/

  パブリック関数 fetch($key) {

  $cacheFile = self::_getCacheFile($key);

  if (file_exists($cacheFile) && is_readable($cacheFile)) {

  // 形式

を含めます

  //return include $cacheFile;

  // 系列化方式

  return unserialize(@file_get_contents($cacheFile, false, NULL, 13));

  }

  false を返します;

  }

  /**

* キャッシュ変数

※情報漏洩防止のため、キャッシュファイルの形式は「"

」で始まるphpファイルとなります。

*

* @param string $key キャッシュ変数の添字

* @param string $value キャッシュ変数の値

* @return bool

​*/

  パブリック関数ストア($key, $value) {

  $cacheFile = self::_getCacheFile($key);

  $cacheDir = ディレクトリ名($cacheFile);

  if(!is_dir($cacheDir)) {

  if(!@mkdir($cacheDir, 0755, true)) {

  throw new CacheException("キャッシュ ディレクトリを作成できませんでした");

  }

  }

  // include 方式

を使用します

  //return @file_put_contents($cacheFile, '

  return @file_put_contents($cacheFile, '' .serialize($value));

  }

  /**

* キャッシュ変数を削除

*

* @param string $key キャッシュのサブスクリプト

* @return Cache_File

​*/

  パブリック関数 delete($key) {

  if(emptyempty($key)) {

  throw new CacheException("Cache_File::delete() の引数 1 がありません");

  }

  $cacheFile = self::_getCacheFile($key);

  if(!@unlink($cacheFile)) {

  throw new CacheException("キャッシュ ファイルを削除できませんでした");

  }

  $this を返す;

  }

  /**

* キャッシュユニットがロックされているかどうか

*

* @param string $key

* @return bool

​*/

  パブリック関数 isLocked($key) {

  $cacheFile = self::_getCacheFile($key);

  clearstatcache();

  return file_exists($cacheFile . '.lock');

  }

  /**

* ロック

*

* @param string $key

* @return Cache_File

*/

パブリック関数ロック($key) {

$cacheFile = self::_getCacheFile($key);

$cacheDir = ディレクトリ名($cacheFile);

if(!is_dir($cacheDir)) {

if(!@mkdir($cacheDir, 0755, true)) {

if(!is_dir($cacheDir)) {

throw new CacheException("キャッシュ ディレクトリを作成できませんでした");

}

}

}

//キャッシュロックファイルのアクセス時間と変更時間を設定します

@touch($cacheFile . '.lock');

$this を返す;

}

/**

  *解锁

  *

  * @param string $key

  * @return Cache_File

  */

パブリック関数のロック解除($key) {

$cacheFile = self::_getCacheFile($key);

@unlink($cacheFile . '.lock');

戻る



関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のおすすめ
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート