HerokuのPHPアプリからRedis To Goを利用するには


HerokuのPHPアプリケーションから、Redis To Goを利用する手順について確認したメモになります。

前提条件

Redis To GoにはFreeプランがありますが、Heroku Add-onsを利用するには、アカウントのBillingにクレジットカードを登録する必要があります。

アドオンの追加

herokuコマンドで、RedisToGoを追加できます。

$ heroku addons:add redistogo

PhpRedisのインストール

PHPのRedis拡張 phpredis/phpredis をComposerでインストールします。

$ composer require ext-redis

2.2 (2016.7.5現在) が追加されました

// composer.json
{
  "require": {
    "ext-redis": "^2.2"
  }
}

PhpRedisには、Redis用のセッションハンドラーとRedisクライアントが含まれます。

補足:
Herokuは、アプリケーションがデプロイされるとcomposer.jsonおよびcomposer.lockを参照して依存するパッケージをインストールしてくれます。
つまりvendorファイルはコミット不要です(参照: Heroku PHP Support | Heroku Dev Center)。

動作確認用サンプル

サンプルコードは、Githubに見にシンプルなものをみつけたのでそれを利用させてもらいます。
ryanbrainard/php-redis-heroku-demo

// index.php
<html>
<head>
  <title>PHP Redis Demo</title>
</head>
<body>

<?php
// Parse out the URL and set as session handler
$redis_url = "tcp://" . parse_url($_ENV['REDISTOGO_URL'], PHP_URL_HOST) . ":" . parse_url($_ENV['REDISTOGO_URL'], PHP_URL_PORT);
if (!is_array(parse_url($_ENV['REDISTOGO_URL'], PHP_URL_PASS))) {
  $redis_url .= "?auth=" . parse_url($_ENV['REDISTOGO_URL'], PHP_URL_PASS);
}
ini_set("session.save_path", $redis_url);
ini_set("session.save_handler", "redis");

// Start the session
session_start();

// Write a value to the session
if (isset($_REQUEST['value'])) {
    $_SESSION['value'] = $_REQUEST['value'];
}

// Close the session to new writes
session_write_close();


// Connecting to Redis for use PHP code directly (non-sessions)
$r = new Redis();
$r->connect(parse_url($_ENV['REDISTOGO_URL'], PHP_URL_HOST), parse_url($_ENV['REDISTOGO_URL'], PHP_URL_PORT));
if (!is_array(parse_url($_ENV['REDISTOGO_URL'], PHP_URL_PASS))) {
  $r->auth(parse_url($_ENV['REDISTOGO_URL'], PHP_URL_PASS));
}
?>

<h1>PHP Redis Demo</h1>

<h2>Backing PHP Sessions with Redis</h2>
<p>Use this form to get and set a value to the PHP session backed by Redis.</p>
<form method="post" action=">
  Value: <input name="value" value="<?php if(isset( $_SESSION['value'])) echo $_SESSION['value']; ?>"/>
  <input type="submit" value="Set in Session"/>
</form>

<h2>Using Redis Directly from PHP</h2>
<p>Hit counter: <?php echo $r->incr('hit_counter'); ?></p>

</body>
</html>

このコードは、セッションストアにRedis To Goを利用する手順と、Redisクライアントを利用して直接Redis To Goを利用する手順について書かれています。

セッション ストア設定と動作確認

9-12行目:
Redis To GoのRedisのURLは、環境変数 REDISTOGO_URL を利用できます。
parse_url関数で分解して、PhpRedisのセッションハンドラにセットする形式のURLに変換しています。

ちなみに、REDISTOGO_URLの値は、herokuコマンドを使って、以下のように確認できます。

$ heroku config | grep REDISTOGO_URL
REDISTOGO_URL              => redis://redistogo:44ec0bc04dd4a5afe77a649acee7a8f3@drum.redistogo.com:9092/

13,14行目:
ini_setメソッドで、PHP設定に以下をセットします。

  • session.save_path: 環境変数 REDISTOGO_URL の値を、PhpRedisのセッションハンドラ用に変換したURL
  • session.save_handler: セッション ハンドラにRedisをセット

参照: GithubのREADME PHP Session handler

20-22行目:
セッションの動作確認用に、POSTデータをセッションに保存します。

41行目:
セッションの動作確認用に、セッションに保存されたデータを表示します。

Redisクライアントの使い方

29行目:
Redisクラスがクライアントになります。

30行目:
connectメソッドでRedisへ接続します(参照: Connection)。
REDISTOGO_URLからホスト名とポートを取り出してセットしています。

31-33行目
REDISTOGO_URLにパスワードが含まれる場合は、authメソッドでパスワードを指定します。

46行目
Redisクライアントの動作確認を、incrメソッドでしています。

動作確認

Herokuにデプロイして、サンプルアプリケーションをブラウザで確認します。
heroku-redis-to-go-sample

セッションについては、[Value: ]に適当な値を入力して[Set in Session]をクリックして保存して、(GETで)再表示してテキストボックスに値が入っていればセッションは正しく設定されています。
また、[Hit counter: ] の数値がリロードするごとに、インクリメントされれば、Redisクライアントも正しく動作しています。