WordPressでサイトを良く作っていた頃にDBからガッツリデータを取得して作成したパーツをキャッシュ化したりするのにCache_Liteを使っていました。さすがにCache_Liteはもう古いよな〜と思っていてちょうどPHPでキャッシュを使いたい案件に当たったのでキャッシュについて調べてみたした。
PHPのキャッシュライブラリについて調べてみる - 画竜点睛を衝く@mapyo
個人的にStashかLaravelので使われているキャッシュライブラリilluminate/cacheが良さそうだなと思い、Stashの方がドキュメントが見やすくて導入が簡単そうだったので今回はStashを使ってみることにしました。
下準備
Composerをインストールする
最近のPHPのライブラリはComposerでインストールするのがナウい感じです。StashもComposerでインストールするので、Composerがインストールされてない場合は、Homebrewでインストールしておきます。
$ brew search composer
homebrew/php/composer ✔
$ brew install homebrew/php/composer
composer
コマンドを打ってロゴが表示されればOKです。
$ composer ______ / ____/___ ____ ___ ____ ____ ________ _____ / / / __ \/ __ `__ \/ __ \/ __ \/ ___/ _ \/ ___/ / /___/ /_/ / / / / / / /_/ / /_/ (__ ) __/ / \____/\____/_/ /_/ /_/ .___/\____/____/\___/_/ /_/
OPcache/APCuをインストールする
PHP5.5以上ではPHPアクセラレーター? キャッシュするライブラリのコト????(正確に理解できてない)にAPCではなくOPcache/APCuを使うらしく、Stashでも内部的に使っているっぽかったので、これらをインストールしておきます。
既にインストールされているかphpinfo();
などでPHPの情報を表示してチェックします。
Zend OPcache とapcuという項目が表示されていれば既にインストールされています。
Zend OPcacheはphp -v
コマンドでも確認できます。
$ php -v PHP 5.6.18 (cli) (built: Feb 26 2016 18:06:26) Copyright (c) 1997-2016 The PHP Group Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies with Zend OPcache v7.0.6-dev, Copyright (c) 1999-2016, by Zend Technologies
with Zend OPcache
と表示されていれば既にインストールされています。
OPcache/APCuがインストールされてない場合はhomebrewでインストールします。
$ brew install php56-apcu $ brew install php56-opcache
インストールが完了したら、サーバーを再起動させます。
再度、phpinfo();
などでPHPの情報を表示しします。Zend OPcache とapcuという項目が表示されていれば導入完了です。
Stash をインストールする
Composerでインストールします。
$ composer require tedivm/stash
Stash でキャッシュを使ってみる
Basic Usageを参考にStashを試してみます。
<?php require_once(__VENDOR_DIR__ . '/autoload.php'); // Driverを作成 $options = array( 'path' => __CACHE_DIR__ ); $driver = new Stash\Driver\FileSystem( $options ); // Poolオブジェクトを作成 $pool = new Stash\Pool($driver); // キャッシュを取得 $item = $pool->getItem('path/to/item'); // キャッシュからデータを取得 $data = $item->get(); // キャッシュが無かった時 if($item->isMiss()) { // Let other processes know that this one is rebuilding the data. $item->lock(); /* 通常処理で$dataを取得 */ $data = expensiveFunction(); $item->set($data); // キャッシュの有効時間を1時間に指定する $item->expiresAfter(3600); // キャッシュを保存 $pool->save($item); } ?>
Driverまわりでのハマりどころメモ。
1.ドライバーの作成方法が変更されている
ドキュメントのDrivers には
<?php // Uses a install specific default path if none is passed. $driver = new Stash\Driver\FileSystem(); // Setting a custom path is done by passing an options array to the constructor. $options = array('path' => '/tmp/myCache/'); $driver->setOptions($options);
と$driver->setOptions
でオプションを後から渡すように書かれていましたが、
使ってみたところsetOptions
はprotected methodに変更されており、オプションはドライバーのイニシャライズに渡すように変更されていました。
2. Notice: Undefined variable: driver でエラーになる
APCやMemcachedを使おうとした時に、Undefined variable: driver
というエラーが出てしまうことがありました。
これはPHPにAPCやMemcachedを使うためのライブラリがインストールされないことが原因のようです。
APCの場合は下準備のAPCuをHomebrewで導入していればOKです。
$ brew install php56-apcu
Memcachedの場合も同様でPHPの情報にmemcachedが無ければHomebrewでインストールします。
$ brew install php56-memcached
PHPのライブラリ?モジュール???をインストールした後はサーバーを再起動させて反映させます。
$ sudo apachectl restart
こんな感じで、ドライバーまわりで少しハマったのですが、比較的簡単にStashを使ってキャッシュを作成することが出来るようになりました。
今のところPHP使ったプロジェクトの多くがレンタルサーバーなので、APCやMemcachedが使える所が少なそうなので結局FileSystemでのキャッシングが多くなりそうですw
[参考]
- PHPのキャッシュライブラリについて調べてみる - 画竜点睛を衝く@mapyo
- Stash — Stash 0.14.0 documentation
- MacにHomebrewでComposerをインストールしました - Qiita
- APCがAPCuとZend OPcacheに取って代わられたワケ - Qiita
- アクセラレータとは - IT用語辞典 Weblio辞書

ユナイテッドジェイズ【100万円グッズ】 新型 百万円札 メモ帳 バラエティグッズ
- 出版社/メーカー: 株式会社 ユナイテッドジェイズ
- メディア: おもちゃ&ホビー
- この商品を含むブログを見る