ホームページ  >  記事  >  バックエンド開発  >  PHP の APC キャッシュの詳細な紹介 (研究と構成)

PHP の APC キャッシュの詳細な紹介 (研究と構成)

WBOY
WBOYオリジナル
2016-06-13 13:10:44868ブラウズ

PHP の APC キャッシュの詳しい紹介 (学習と整理)

1. APC キャッシュの概要

APC、正式名称はAlternative PHP Cache、正式訳は「Optional PHP Cache」と呼ばれます。これは、PHP の中間コードをキャッシュして最適化するためのフレームワークを提供します。 APC のキャッシュは、システム キャッシュとユーザー データ キャッシュの 2 つの部分に分かれています。

システム キャッシュ

これは、APC が PHP ファイルのソース コードのコンパイル結果をキャッシュし、呼び出されるたびにタイムスタンプを比較することを意味します。有効期限が切れていない場合は、キャッシュされた中間コードが実行に使用されます。デフォルトのキャッシュ 3600 秒 (1 時間)。しかし、それでもかなりの CPU 時間を浪費します。したがって、php.ini でシステム キャッシュを期限切れにしないように設定できます (apc.ttl=0)。ただし、このように設定した場合、PHP コードを変更した後に WEB サーバーを再起動する必要があります。現在、このタイプのキャッシュが一般的に使用されています。

ユーザーデータキャッシュ

キャッシュは、PHP コードを記述するときに、ユーザーが apc_store 関数と apc_fetch 関数を使用して読み書きします。データ量がそれほど多くない場合は、試してみてください。データの量が大きい場合は、memcache

のような、より特化したメモリ キャッシュ ソリューションを使用することをお勧めします。

キャッシュキー生成ルール

APC キャッシュの各スロットにはキーがあり、そのキーは apc_cache_key_t 構造体タイプは、キー関連の属性に加えて、h フィールドの生成もキーとなります。 h フィールドは、この要素がスロット配列内のどこに位置するかを決定します。ユーザーキャッシュとシステムキャッシュでは生成ルールが異なります。 ユーザー キャッシュは、apc_cache_make_user_key 関数を通じてキーを生成します。ユーザーによって渡されたキー文字列は、PHP カーネルのハッシュ関数 (PHP のハッシュテーブルで使用されるハッシュ関数: zend_inline_hash_func) に基づいて h 値を生成します。

システム キャッシュは、apc_cache_make_file_key 関数を通じてキーを生成します。 APC 設定項目 apc.stat のスイッチを介して、異なるソリューションを異なる方法で処理できます。オープンの場合、つまり apc.stat= On の場合、コンパイルされたコンテンツは更新されると自動的に再コンパイルされ、キャッシュされます。このときのhの値は、ファイルのdeviceとinodeを足した値になります。シャットダウンの場合、つまり apc.stat=off の場合、ファイルが変更されたときに、更新された内容を有効にするには、Web サーバーを再起動する必要があります。このとき、h値はファイルのパスアドレスに基づいて生成され、ここでのパスは絶対パスとなる。相対パスを使用する場合でも、PG (include_path) ロケーション ファイルを検索して絶対パスを取得するため、絶対パスを使用するとチェックが省略され、コードの効率が向上します。

キャッシュプロセスの追加

ユーザー キャッシュを例に挙げると、apc_add 関数を使用してコンテンツを APC キャッシュに追加します。キー パラメーターが文字列の場合、APC はその文字列に基づいてキーを生成します。キー パラメーターが配列の場合、APC は配列全体を走査してキーを生成します。これらのキーに基づいて、APC は _apc_store を呼び出して値をキャッシュに保存します。これはユーザー キャッシュであるため、現在使用されているキャッシュは apc_user_cache です。書き込み操作を実行するのは apc_cache_make_user_entry 関数であり、最終的に apc_cache_user_insert を呼び出してトラバーサル クエリと書き込み操作を実行します。同様に、システム キャッシュは apc_cache_insert を使用して書き込み操作を実行し、最終的に _apc_cache_insert を呼び出します。

ユーザー キャッシュでもシステム キャッシュでも、一般的な実行プロセスは次のとおりです。

  1. 剰余演算を通じて、スロット配列内の現在のキーの位置を特定します:cache->slots[key.h % cache->num_slots];
  2. スロット配列内の位置を見つけた後、現在のキーに対応するスロットのリンクされたリストを調べます。書き込まれるキーと一致するスロット キーがある場合、またはスロットの有効期限が切れた場合は、現在のスロットをクリアします。
  3. 最後のスロットの後に新しいスロットを挿入します。

2. APC モジュールのインストール

ウィンドウ

ステップ 1: http://pecl.php.net/package/apc で php_apc.dll をダウンロードし、PHP のバージョンと一致させるために、php_apc.dll を ext ディレクトリ

に置きます。

ステップ 2: php.ini で apc 拡張モジュールをサポートさせます。 次に、php.ini を開いて以下を追加します:

拡張子=php_apc.dll

apc.rfc1867 = オン

apc.max_file_size = 100M

アップロード_最大ファイルサイズ = 100M

post_max_size = 100M

//上記のパラメータは自分で定義できます

ステップ 3: PHP APC がサポートされているかどうかを確認する apc_store apc_fetch PHP APC 設定パラメーター 関連する設定をまとめて説明します。

apc.enabled=1 apc.enabled のデフォルト値は 1 ですが、0 に設定すると APC を無効にできます。 0 に設定する場合は、extension=apc.so もコメントアウトします (これによりメモリ リソースを節約できます)。 APC 機能が有効になると、オペコードは共有メモリにキャッシュされます。

apc.shm_segments = 1

概要 1. Spinlocks ロック メカニズムを使用すると、最高のパフォーマンスを実現できます。

2. APC は、APC キャッシュを監視および管理するための apc.php を提供します。管理者名とパスワードを忘れずに変更してください

3. APC はデフォルトで mmap 匿名マッピングを通じて共有メモリを作成し、キャッシュ オブジェクトはこの「大きな」メモリ空間に保存されます。共有メモリは APC 自体によって管理されます

4. 統計を通じて、apc.shm_size、apc.num_files_hints、および apc.user_entries_hint の値を調整する必要があります。最高になるまで

5. まあ、apc.stat = 0 のほうがパフォーマンスが向上することは認めます。私から望むものは何でも受け入れてください。

6. PHP の事前定義定数。apc_define_constants() 関数を使用できます。ただし、APC 開発者によると、pecl Hidef の方がパフォーマンスが優れており、例外定義をスローするだけなので非効率的です。

7. apc_store() 関数。システム設定などの PHP 変数の場合、ライフサイクルはアプリケーション全体です (httpd デーモンが終了するまで)。Memcached よりも APC を使用する方が適切です。結局のところ、ネットワーク伝送プロトコル tcp は使用しないでください。

8. APC は、頻繁に変更されるユーザーデータを apc_store() 関数を通じてキャッシュするのには適しておらず、いくつかの奇妙な現象が発生します。

LIUNX

wget http://pecl.php.net/get/APC-3.1.8.tgz

tar -zxvf APC-3.1.8.tgz cd APC-3.1.8

/usr/local/php/bin/phpize

./configure --enable-apc --enable-mmap --enable-apc-spinlocks --disable-apc-pthreadmutex --with-php-config=/usr/local/php/bin/php-config

作る

sudo make install

/usr/local/php/etc/php.ini に

を追加します

拡張子 = "apc.so" ;

;APC設定

apc.enabled = 1

apc.shm_segments = 1

apc.shm_size = 64M

apc.optimization = 1

apc.num_files_hint = 0

apc.ttl = 0

apc.gc_ttl = 3600

apc.cache_by_default = オン

Apache または /usr/local/php/sbin/php-fpm restart

を再起動します

phpinfo apc を表示

以下は、www.initphp.com フレームワーク の APC キャッシュ クラスを参照しています。

initphp フレームワークの APC キャッシュ クラス

<?php
if (!defined('IS_INITPHP')) exit('Access Denied!');
/*********************************************************************************
 * InitPHP 2.0 国产PHP开发框架  Dao-APC缓存 不适合频繁写入的缓存数据
 *-------------------------------------------
 * 版权所有: CopyRight By initphp.com
 * 您可以自由使用该源码,但是在使用过程中,请保留作者信息。尊重他人劳动成果就是尊重自己
 *-------------------------------------------
 * $Author:zhuli
 * $Dtime:2011-10-09 
***********************************************************************************/
class apcInit {
	
	/**
	 * Apc缓存-设置缓存
	 * 设置缓存key,value和缓存时间
	 * @param  string $key   KEY值
	 * @param  string $value 值
	 * @param  string $time  缓存时间
	 */
	public function set_cache($key, $value, $time = 0) { 
		if ($time == 0) $time = null; //null情况下永久缓存
		return apc_store($key, $value, $time);;
	}
	
	
	/**
	 * Apc缓存-获取缓存
	 * 通过KEY获取缓存数据
	 * @param  string $key   KEY值
	 */
	public function get_cache($key) {
		return apc_fetch($key);
	}
	
	/**
	 * Apc缓存-清除一个缓存
	 * 从memcache中删除一条缓存
	 * @param  string $key   KEY值
	 */
	public function clear($key) {
		return apc_delete($key);
	}
	
	/**
	 * Apc缓存-清空所有缓存
	 * 不建议使用该功能
	 * @return
	 */
	public function clear_all() {
		apc_clear_cache('user'); //清除用户缓存
		return apc_clear_cache(); //清楚缓存
	}
	
	/**
	 * 检查APC缓存是否存在
	 * @param  string $key   KEY值
	 */
	public function exists($key) {
		return apc_exists($key);
	}
	
	/**
	 * 字段自增-用于记数
	 * @param string $key  KEY值
	 * @param int    $step 新增的step值
	 */
	public function inc($key, $step) {
		return apc_inc($key, (int) $step);
	}
	
	/**
	 * 字段自减-用于记数
	 * @param string $key  KEY值
	 * @param int    $step 新增的step值
	 */
	public function dec($key, $step) {
		return apc_dec($key, (int) $step);
	}
	
	/**
	 * 返回APC缓存信息
	 */
	public function info() {
		return apc_cache_info();
	}
}

追伸: 上記は学習の概要です。皆様のお役に立てれば幸いです

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。