PHP の APC キャッシュの詳しい紹介 (学習と整理)
APC、正式名称はAlternative PHP Cache、正式訳は「Optional PHP Cache」と呼ばれます。これは、PHP の中間コードをキャッシュして最適化するためのフレームワークを提供します。 APC のキャッシュは、システム キャッシュとユーザー データ キャッシュの 2 つの部分に分かれています。
キャッシュは、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: 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() 関数を通じてキャッシュするのには適しておらず、いくつかの奇妙な現象が発生します。
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 キャッシュ クラスを参照しています。
<?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(); } }
追伸: 上記は学習の概要です。皆様のお役に立てれば幸いです