Vagrant に redis をインストールし FuelPHP で cache 利用


前回、FuelPHP で Welcome ページ参照までを行いました。今回は、cache 機構に Redis を使ってみたかったので、基本的なことですが、MacBookAir の Vagrant 内で検証してみました。

# 構築する環境

* OSX 10.9.5
* Vagrant
* CentOS 6.5
* FuelPHP 1.7.2
* Redis server 2.4.10
* Redis-cli 2.4.10

# 参考: 前回
前回、Welcomeページまでセットした環境の続きとして実行しています。
[Mac 上で Vagrant を使って CentOS に FuelPHP をセットアップ
](http://qiita.com/hmukaida/items/4020a30f9ee651e688b8)

# 参考：Redis まわり
Redis のインストールや操作は下記を参考にさせていただきました。
[CentOS-6.5でredisサーバ構築](http://d.hatena.ne.jp/URI/20140513/p2)
[FuelPHPのキャッシュライブラリ – redis編](http://9ensan.com/blog/programming/php/fuelphp-cache-redis/)

# 参考：日本語FuelPHPドキュメント
[Cache](http://fuelphp.jp/docs/1.6/classes/cache/config.html)
[Redis](http://fuelphp.jp/docs/1.6/classes/redis.html)


# まずは Redis インストール
vagrant 内でのコマンドですので、全て[vagrant]としてコマンドラインを表現しています。
```
[vagrant] yum --enablerepo=epel install redis
...
...
Complete!
```

特に違和感なくインストールされました。
それでは Redis server を start します。

```
[vagrant] /etc/init.d/redis start
Starting redis-server:                                     [  OK  ]
```

次にバージョンを確認してみます。まずは server のバージョン。

```
[vagrant] redis-server -v
Redis server version 2.4.10 (00000000:0)
```

次に client のバージョン

```
[vagrant] redis-cli -v
redis-cli 2.4.10
```

次に動作確認をします。client を起動し簡易的に確認です。

```
[vagrant] redis-cli
redis 127.0.0.1:6379>
redis 127.0.0.1:6379> set hoge 'foo'
OK
redis 127.0.0.1:6379> get hoge
"foo"
```

セットしたデータが取得できていますので問題無さそうです。
一旦、セットしたデータを全てクリアしておきましょう。

```
[vagrant] redis-cli
redis 127.0.0.1:6379> flushall
OK
redis 127.0.0.1:6379> get hoge
(nil)
```

これでクリアが完了しました。


# FuelPHP の準備

下記ファイルを準備していきます。

* Controller
    * app/classes/controller/redis.php
* View
    * app/views/cache/redis.php
* 使用するClass
    * app/classes/object.php

```app/classes/controller/redis.php
<?php

class Controller_Redis extends \Fuel\Core\Controller
{
    public function action_index()
    {
        // string
        Cache::set('string', 'cache test' . Date::time());
        $data['string'] = Cache::get('string');

        // Array
        $arr = array(
            1,
            2,
            array(
                'key'   => 'value',
                'key2'  => 'value2',
                'time'  => Date::time(),
            )
        );
        Cache::set('array', $arr);
        $data['array'] = Cache::get('array');

        // Object
        $obj = new Object();
        Cache::set('object', $obj);
        $data['object'] = Cache::get('object');

        return Response::forge(View::forge('cache/redis', $data));
    }
}
```

```app/views/cache/redis.php
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>Cache: Redis</title>
</head>
<body>
<p>Cache: Redis</p>
<div>String:<?php var_export($string) ?></div>
<div>Array :<?php var_export($array) ?></div>
<div>Class :<?php var_export($object) ?></div>
</body>
</html>
```

```app/classes/object.php
<?php

class Object
{
    public static function _init()
    {
    }

    public function __toString()
    {
        return 'Object';
    }
}
```

これで準備完了です。

# FuelPHP で cache セット及び確認
それでは、アクセスしてみましょう。http://192.168.33.01/redis (IPはvagrantの各自設定に従ってください。)
![kobito.1417490506.497065.png](https://qiita-image-store.s3.amazonaws.com/0/39380/9e4a2280-08dd-98d9-ddb2-f218531fa4d7.png "kobito.1417490506.497065.png")

セットした String, Array, Object が表示されていれば成功です。


# Redis の cache をクリアして cache だけ参照
ここで cache へアクセスできなかったケースを見てみましょう。次のファイルを準備します。

* Controller
    * app/classes/controller/redis2.php

```app/classes/controller/redis2.php
<?php

class Controller_Redis2 extends \Fuel\Core\Controller
{
    public function action_index()
    {
        try{
            $data['string'] = Cache::get('string');
        }
        catch (\CacheNotFoundException $e) {
            $data['string'] = 'none string';
        }

        try{
            $data['array'] = Cache::get('array');
        }
        catch (\CacheNotFoundException $e) {
            $data['array'] = 'none array';
        }

        try{
            $data['object'] = Cache::get('object');
        }
        catch (\CacheNotFoundException $e) {
            $data['object'] = 'none object';
        }

        return Response::forge(View::forge('cache/redis', $data));
    }
}
```

キャッシュが取得できない場合は、CacheNotFoundException の Exception が発行されるため、こちらで処理を追加しておきます。

この状態で、http://192.168.33.01/redis2 にアクセスしますと、先ほどと同じ結果が表示されるはずです。

ここで、一旦、Redis の中身をクリアしてみましょう。

```
[vagrant] redis-cli
redis 127.0.0.1:6379> flushall
OK
redis 127.0.0.1:6379> get hoge
(nil)
```

そして、再度、http://192.168.33.01/redis2 にアクセスしますと、次のような結果になります。
![kobito.1417490801.144532.png](https://qiita-image-store.s3.amazonaws.com/0/39380/9efbcfee-b84d-e1eb-7863-ea0b2c3887b5.png "kobito.1417490801.144532.png")


# まとめ
ここまで Redis のインストールから、FuelPHP での操作方法を少し試してみました。とても簡単に試すことができました。特に違和感なく利用できるのが本当に頼もしいところです。

本番で利用する際には、サービス規模にもよりますが、AWS の ElasticCache([ElastiCacheのRedisクラスターにバックアップとリストア機能が追加](http://aws.typepad.com/aws_japan/2014/04/backup-and-restore-elasticache-redis-nodes.html)) を利用するなどでしょうか。

cache の設計と利用を効率良く実施し、サービスのパフォーマンスを向上させたいですね。