Heroku 環境で、PHP のセッションストレージとして、Redis(Redis To Go)を利用する手順です。
Redis To Go アドオンを追加
Redis サーバとして、Redis To Go アドオンを利用します。(無料プラン(Nano)あり: 接続数上限=10 / データベース=1 / インスタンスサイズ=5MB)
https://addons.heroku.com/redistogo
$ heroku addons:add redistogo
composer.json に redis 拡張を追加
Heroku 上の PHP で、redis 拡張を使うために composer.json
に redis
を追加しておきます。
{
"require": {
"ext-redis": "*"
}
}
環境変数から接続情報を取得
Redis To Gos アドオンを追加すると、Redis To Go への接続情報が環境変数REDISTOGO_URL
にセットされます。
REDISTOGO_URL
の内容は下記のような URL の形式になっています。
REDISTOGO_URL=redis://redistogo:xxxxxxxxxxxxxxxxxxxxxxxx@xxxxx.redistogo.com:PORT/
これを PHP のparse_url()
でパースします。
<?php
$url = parse_url(getenv('REDISTOGO_URL'));
スクリプトを実行すると、$url
の各要素には下記のようになります。
- $url['host'] = 接続ホスト名
- $url['port'] = 接続ポート
- $url['pass'] = 接続パスワード
この内容を接続情報として利用します。
セッションハンドラに設定する
redis 拡張のセッションハンドラをini_set
で設定します。session.save_path
には、環境変数から取得した値を元に接続情報を記載します。
パスワードをauth=PASS
のようにクエリストリングで指定するのがポイントです。
<?php
const SESSION_KEY = 'count';
$url = parse_url(getenv('REDISTOGO_URL'));
$redisServer = sprintf('tcp://%s:%d?auth=%s', $url['host'], $url['port'], $url['pass']);
ini_set('session.save_handler', 'redis');
ini_set('session.save_path', $redisServer);
// session
session_start();
if (empty($_SESSION[SESSION_KEY])) {
$_SESSION[SESSION_KEY] = 0;
}
$_SESSION[SESSION_KEY]++;
var_dump($_SESSION);
Laravel で接続する
まず、Redis サーバへの接続情報をapp/config/database.php
に接続情報をセットしています。
<?php
$redisUrl = parse_url(getenv('REDISTOGO_URL'));
return [
'redis' => [
'cluster' => false,
'default' => [
'host' => $redisUrl['host'],
'port' => $redisUrl['port'],
'database' => 0,
'password' => $redisUrl['pass'],
],
],
];
次に、app/config/session.php
で、ドライバを、redis に設定します。
<?php
return [
'driver' => 'redis',
];
また、app/config/cache.php
で、ドライバを redis にしておけば、キャッシュも Redis サーバに保存されます。
<?php
return [
'driver' => 'redis',
];