PHP キャッシュ テクノロジと PHP キャッシュ実装コードの詳細な紹介_PHP チュートリアル

WBOY
リリース: 2016-07-20 11:11:00
オリジナル
942 人が閲覧しました

一部の情報 (多くは一定ですが変更される可能性がある情報) は、表示を高速化するためにキャッシュに保存されます。これは、一般に、サーバーに保存される共有情報であると考えられています。生と死と同様に、キャッシュを保存するときに次の更新時間を指定できます。たとえば、5 分ごとに更新する必要があります

データ キャッシュ: ここで言うデータ キャッシュはデータベース クエリを指します。 PHP のキャッシュ機構は、ページにアクセスされるたびに、まず対応するキャッシュ データが存在するかどうかを検出し、存在しない場合はデータベースに接続してデータを取得し、クエリ結果をシリアル化して保存します。将来的には、同じクエリ結果がキャッシュ テーブルまたはファイルから直接取得されるようになります。

最も広く使用されている例は、結果 ID をテーブルにキャッシュし、次回同じキーワードを検索するときに最初にキャッシュ テーブルを検索する Discuz の検索機能です。

一般的な方法として、複数のテーブルが関連付けられている場合、配列を生成し、添付されたテーブルの内容をメインテーブルのフィールドに保存します。これには、1 つのテーブルのみを読み取るという利点があります。データを同期するには、さらに多くの手順が必要になります。この場合、データベースが常にボトルネックになります。

ページキャッシュ:

ページにアクセスするたびに、対応するキャッシュされたページファイルが存在するかどうかが最初に検出され、存在しない場合はデータベースに接続し、データを取得してページを表示し、キャッシュされたページファイルを生成します。同時に、次回アクセスするときにページ ファイルが活躍するようになります。 (インターネット上のテンプレート エンジンと一部の一般的な PHP キャッシュ メカニズム クラスには、通常この機能があります)

時間トリガー キャッシュ:

ファイルが存在するかどうか、およびタイムスタンプが設定された有効期限よりも小さいかどうかを確認します (ファイル変更のタイムスタンプがある場合)。有効期限のタイムスタンプが大きい場合はキャッシュを使用し、それ以外の場合はキャッシュを更新します。

コンテンツトリガーキャッシュ:

データが挿入または更新されたときに、PHP キャッシュメカニズムを強制的に更新します。

静的キャッシュ:

ここで言う静的キャッシュとは、HTMLやXMLなどのテキストファイルを直接生成し、更新があった場合に再生成する静的キャッシュを指します。あまり変更のないページに適しているので、勝ちました。ここではそれについて話さないでください。

上記のコンテンツはコードレベルのソリューションであり、他のフレームワークを直接CPするため、変更するのが面倒ですが、次のコンテンツはサーバーです。非コード レベルのキャッシュ ソリューション。これを実現するには複数の関係者の協力が必要です

メモリ キャッシュ:

Memcached は、データベースの負荷を軽減し、アクセスを向上させるために使用される、高性能の分散メモリ オブジェクト PHP キャッシュ メカニズム システムです。動的アプリケーションの速度を向上させます。

PHP バッファ:

eaccelerator、apc、phpa、xcache があります。これらについては説明しませんが、これを知っていれば問題ありません

MYSQL キャッシュ:

これは非コードレベルと考えられます。クラシックデータベースはこの方法を使用します。以下の実行時間を見てください。0.09xxx など
青いやつに従って変更された my.ini のセクションを投稿します。2G MYISAM テーブル付近である可能性があります。 0.05Sを1年近く変えているそうです

リバースプロキシベースのWebキャッシュ:

Nginx、SQUID、mod_proxyなど(apache2以降はmod_proxyとmod_cacheに分かれています)
NGINXの例

使用法 Google がいくつかの PHP キャッシュ技術メソッドを見つけました

APC とファイル キャッシュを実装する PHP キャッシュ実装を送ってください Cache_Abstract を継承することで、サードパーティのキャッシュ ツールを呼び出すことができます。
shindigのキャッシュクラスとapcを参照してください。

Phpコード

代码如下复制代class CacheException extends Exception {}
/**
* キャッシュ抽象クラス
*/
abstract class Cache_Abstract {
/* *
* キャッシュ変数の読み取り
*/
抽象公開関数フェッチ($key);  

/**
* キャッシュ変数*/
抽象パブリック関数ストア($key, $value);  

/**
* キャッシュ変数の削除
*/
抽象パブリック関数 delete($key);  

/**
*すべてのキャッシュをクリア(削除)します*/
抽象パブリック関数clear();  

/**存 * キャッシュ変数をロックします
* @param String $ キーキャッシュ入札
* @Returncache_abstract
*/
抽象公開関数ロック($key);  

/**解 * キャッシュ変数のロック解除
* @param String $ key Bidding
* @Returncache_abstract
*/
抽象パブリック関数unlock($key);  

/**
*キャッシュ変数がロックされているかどうかを取得する*/
抽象パブリック関数 isLocked($key);  

/**
* * ロックされていないことを確認してください
* ロック解除を待機するために最大 $tries 回スリープし、タイムアウトになったらスキップしてロックを解除します
*/
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 を返します。  
}
}


/**
* APC 拡張キャッシュの実装
*
*
* @category Mjie
* @package Cache
* @author 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';  

public function __construct() {
if (!function_exists('apc_cache_info')) {
throw new CacheException('apc拡張機能がインストールされていません');  
}
}

/**
*使用する 使用する 使用する 使用する 使用する 使用する アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト*/
public function store($key, $value) {
return apc_store($this->_storageKey($key), $value);  
}

/**
*/
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 を返します。  
}

/**
* 完全なキャッシュ名
**/
private function _storageKey($key) {
return $this->_prefix . '_' 。 $キー;  
}
}

/**
* ファイルキャッシュの実装
*
*
* @category Mjie
* @package Cache
* @author Liu Shui Meng Chun
* @copyright Copyright (c) 2008-
* @ライセンス 新しい 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 (define('DATA_DIR')) {
$this->_setCacheDir(DATA_DIR . '/cache');  
}
}

/**
*/
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
*/
パブリック関数store($key, $value) {
$cacheFile = self::_getCacheFile($key);  
$cacheDir = dirname($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));  
}

/**
*/
public function delete($key) {
if(emptyempty($key)) {
throw new CacheException("Cache_File::delete() の引数 1 がありません" );  
}

$cacheFile = self::_getCacheFile($key);  
if(!@unlink($cacheFile)) {
throw new CacheException("キャッシュ ファイルを削除できませんでした");  
}

$this を返します。  
}

/**
*/
パブリック関数 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("キャッシュ ディレクトリを作成できませんでした" );  
}{/ ** 
* 解锁
*
* @param string $key
* @return Cache_File
    */
public functionunlock($key) {
$cacheFile = self::_getCacheFile($key);
@unlink($cacheFile . '.lock');
return








http://www.bkjia.com/PHPjc/444684.html
www.bkjia.comtru​​e
http://www.bkjia.com/PHPjc/444684.html

技術記事一部の情報は、表示を高速化するためにキャッシュに保存されます。一般的には、一部の情報はサーバー側に保存されます。 ...
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!