8
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

PHPでAPCuを使って共有メモリにキャッシュを実現する方法

Last updated at Posted at 2022-06-09
../

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
../
8
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?