FuelPHP セッションリストアを Redis に設定する


## 環境

* Ubuntu 14.04
* FuelPHP 1.7.3
* 開発環境の redis のホスト localhost
* 製品環境の redis のホスト Amazon ElastiCache

## Redis のインストール

### インストール

```bash
$ sudo apt-get install redis-server
```

```bash
$ sudo service redis-server start
```

### バージョンの確認

```bash
$ redis-server --version
```

### 接続の確認

#### localhost

```bash
$ redis-cli -h localhost
```

#### ElastiCache

[ElasticCache - AWS ElastiCacheでredis - Qiita](http://qiita.com/supertaihei02/items/f3ef9148fd5235ee2816 "ElasticCache - AWS ElastiCacheでredis - Qiita") を参考に ElastiCache を作成しておく。

```bash
$ redis-cli -h xxxxxx.yyyyyy.nnnn.apne1.cache.amazonaws.com
```

## Session の設定

`fuel/core/config/session.php` を `fuel/app/config/session.php` にコピーし、Session を設定する。

```diff:fuel/app/config/session.php
…
-	'driver' = 'cookie', 
+	'driver' = 'redis',
…
	'redis'			=> array(
		'cookie_name'		=> 'fuelrid',	// セッションを格納するために使用されるクッキー名
		'database'			=> 'default',	// fuel/app/config/db.php の redis セクションで定義された名前
						),
…
```

## DB の設定

`fuel/core/config/db.php` を `fuel/app/config/<environment>/db.php` にコピーし、Redis を設定する。

### 開発環境

```diff:fuel/app/config/develpment/db.php
	return array(
		'default' => array(
			'connection'  => array(
				'dsn'        => 'mysql:host=localhost;dbname=db',
				'username'   => 'username',
				'password'   => 'password',
			),
		),
+		'redis' => array(
+			'default' => array(
+				'hostname' => '127.0.0.1',
+				'port' => 6379,
+				'timeout' => null,
+			),
+		),
  );
```

### 製品環境


```diff:fuel/app/config/production/db.php
	return array(
		'default' => array(
			'connection'  => array(
				'dsn'        => 'mysql:host=localhost;dbname=db',
				'username'   => 'username',
				'password'   => 'password',
			),
		),
+		'redis' => array(
+			'default' => array(
+				'hostname' => 'xxxxxx.yyyyyy.nnnn.apne1.cache.amazonaws.com',
+				'port' => 6379,
+				'timeout' => null,
+			),
+		),
  );
```

## 暗号キーの設定



[FuelPHPでセッション共有時の注意点 - Qiita](http://qiita.com/takakiku/items/c6f508330070b06f8e81 "FuelPHPでセッション共有時の注意点 - Qiita") の記載通り、 **FuelPHP でセッション情報を ElastiCache を使って複数ノードで共有する場合には、 `fuel/app/config/crypt.php` を複数ノードで同じ値となるように暗号キーを設定する必要がある** らしい…。

FuelPHP では SessionID を Cookie 名に設定する時に暗号化を行っており、この時に使用する暗号キーがノード毎に異なるとセッション情報の共有ができない。1 度 Session を使用すると、以下のように `crypt.php` に暗号キーが設定され自動的に生成される。

```php:fuel/app/config/crypt.php
<?php
return array(
	'crypto_key' => 'XXXXXXXXXXXXXXXXXXXXXXXX',
	'crypto_iv' => 'XXXXXXXXXXXXXXXXXXXXXXXX',
	'crypto_hmac' => 'XXXXXXXXXXXXXXXXXXXXXXXX',
);
```

`crypt.php` において `'crypto_key'` `'crypto_iv'` `'crypto_hmac'` の 3 つの暗号キーが必要となり、 **base64decode 可能な文字列** で且つ **文字列の長さは 4 の倍数** という条件を満たす必要がある。条件を満たさない場合は、 `crypt.php` が再作成されノード毎に異なってしまう。



## 参考文献

* [【fuelphp】セッション保存先をredisにする方法メモ - とりあえずphpとか](http://kimagureneet.hatenablog.com/entry/2016/01/05/135147 "【fuelphp】セッション保存先をredisにする方法メモ - とりあえずphpとか")
* [ElasticCache - AWS ElastiCacheでredis - Qiita](http://qiita.com/supertaihei02/items/f3ef9148fd5235ee2816 "ElasticCache - AWS ElastiCacheでredis - Qiita")
* [FuelPHPでセッション共有時の注意点 - Qiita](http://qiita.com/takakiku/items/c6f508330070b06f8e81 "FuelPHPでセッション共有時の注意点 - Qiita")
* [Session 設定 - クラス - FuelPHP ドキュメント](http://fuelphp.jp/docs/1.8/classes/session/config.html "Session 設定 - クラス - FuelPHP ドキュメント")