../ |
---|
PHPのAPCu
というライブラリを利用してみた。標準のPHPには同梱されていないので、ダウンロードしてDLLを追加した。APCuは「APC User Cache」の略である。APCは「Alternative PHP Cache」の略である。(ちなみに、PHPは「PHP Hypertext Preprocessor」の略である。再帰的な略になっている。GNUの「GNU's Not Unix!」を真似たのかな。)
JavaとTomcatでは、高速化のため、またDBやファイルへのアクセス負荷を軽減するために、メモリ上にキャッシュを作成して利用することがたびたびある。探索時にはメモリ上のキャッシュから探し、なければDBやファイルから検索したり、読み込んだりする。PHPでは、ブラウザで画面が遷移するごと(redirectするごと)に新たなプロセスが生成されるので、メモリ上に生成したオブジェクトを単純には共有できない。APCuを使って、プロセス間で共有メモリ上にオブジェクトを保持させ、取り出すことが可能になる。
APCuの使い方
APCuの使い方は、単純明快である。apcu_store()
で格納し、apcu_fetch()
で取得する。格納されているデータをキャッシュから取り除くためのapcu_delete()
もある。
<?php
apcu_store('foo', $bar);
var_dump(apcu_fetch('foo'));
?>
もっと具体的な例だと次の感じである。ユーザー一覧をDBやファイルなどから取得する場合、高速化のためにメモリ上にキャッシュしておく例である。キャッシュにあれば、それを返す。なければ、検索に行き、検索結果はキャッシュに保持しておく。
<?php
public function getUsers(): array {
$users = apcu_fetch('users');
if (!empty($users)){
return $users;
}
$accessor = new UserDataAccessor(); // DBやファイルにあるユーザー情報にアクセスするためのDAO
$users = $accessor->getUsers(); // ユーザー一覧を取得する。
apcu_store('users', $users);
return $users;
}
?>
ユーザー情報に変更があれば、キャッシュをクリアしておく必要があり、そのときはapcu_delete()を使うといいだろう。
apcu_store()では、引数で与えられたオブジェクトはその時点のスナップショットとしてコピーされて保持される。参照渡しの場合も同様である。「PHP7.4で、$_SESSIONとACPuはどのようにキャッシュされるのか」を参照のこと。
APCuのダウンロードとセットアップ
APCuは、https://windows.php.net/downloads/pecl/releases/apcu/5.1.18/ から php_apcu-5.1.18-7.4-ts-vc15-x64.zip
をダウンロードしてきた。x86版も並んでいるので間違えないこと。最新版は5.1.21のようだったが、私のEclipseの環境は PHP 7.4 なので、それに合わせたバージョンを選んでいる。
zipを展開して、php_apcu.dll
をPHPのインストール先のext
ディレクトリ配下に置く。私の場合 C:\pleiades-xxx\xampp\php\ext である。
そして、php.ini
に以下の4行を追記する。php.ini は、私の場合 C:\pleiades-xxx\xampp\php\php.iniである。
extension=php_apcu.dll
apc.enabled=1
apc.enable_cli=1
apc.shm_size=64M
Eclipseをcleanモードで再起動して試してみよう。
ちなみに、x86版やバージョンの異なるDLLをコピーすると、以下のようなランタイムエラーが起きた。php_apcu.dll が不適切だったら、php_php_apcu.dll.dll を探しにいくみたい。
PHP Warning: PHP Startup: Unable to load dynamic library 'php_apcu.dll'
(tried: C:\pleiades-php2\xampp\php\ext\php_apcu.dll
(%1 は有効な Win32 アプリケーションではありません。),
C:\pleiades-php2\xampp\php\ext\php_php_apcu.dll.dll
(指定されたモジュールが見つかりません。)) in Unknown on line 0
../ |
---|