かもメモ

自分の落ちた落とし穴に何度も落ちる人のメモ帳

PHP5.6 Mac環境 Stashでキャッシュを作成してみる。

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 OPcacheapcuという項目が表示されていれば既にインストールされています。
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 OPcacheapcuという項目が表示されていれば導入完了です。

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でオプションを後から渡すように書かれていましたが、
使ってみたところsetOptionsprotected methodに変更されており、オプションはドライバーのイニシャライズに渡すように変更されていました。

Removed `Driver::setOptions($options)` in favor of `Driver::construct… · tedious/Stash@1a9c755 · GitHub

2. Notice: Undefined variable: driver でエラーになる
APCMemcachedを使おうとした時に、Undefined variable: driverというエラーが出てしまうことがありました。
これはPHPAPCMemcachedを使うためのライブラリがインストールされないことが原因のようです。

APCの場合は下準備のAPCuをHomebrewで導入していればOKです。

$ brew install php56-apcu

Memcachedの場合も同様でPHPの情報にmemcachedが無ければHomebrewでインストールします。

$ brew install php56-memcached

PHPのライブラリ?モジュール???をインストールした後はサーバーを再起動させて反映させます。

$ sudo apachectl restart

 
こんな感じで、ドライバーまわりで少しハマったのですが、比較的簡単にStashを使ってキャッシュを作成することが出来るようになりました。
今のところPHP使ったプロジェクトの多くがレンタルサーバーなので、APCMemcachedが使える所が少なそうなので結局FileSystemでのキャッシングが多くなりそうですw


[参考]

ユナイテッドジェイズ【100万円グッズ】 新型 百万円札 メモ帳 バラエティグッズ

ユナイテッドジェイズ【100万円グッズ】 新型 百万円札 メモ帳 バラエティグッズ