[heroku]PHPのセッションをherokuのRedisで管理する

heroku上でのPHPのセッション管理の定番はMemCachierだけれど、
今回はHerokuのRedisに保存さえてみた。

Redis

herokuで使えるRedis、といってもいくつか種類がある。
それぞれどう違うのか、とか、設定方法の違い、とかは正直わからない。

herokuでセッションの保存先をRedisにする – Qiita

現在、heroku には4つの Redis のアドオンがあります。
早晩5つめが増えるようです。

この5つめ、にあたるものが今回使用する、Heroku Redis、です。   これは他のredisと違って、Postgresと同じくheroku内部のものなのでまぁ間違いないのかも、ってことで使ってみました。

Heroku Redis

インストール

公式の通り、インストールコマンドは以下。
アプリページからポチポチっと入れても問題なし。

$ eroku addons:create heroku-redis:hobby-dev -a YOUR-APP-NAME

hobby-devは無料バージョン。

セットアップ

必要なソースはComposerで入れる。

(公式より)

1
2
3
4
5
"require": {
  ...
  "predis/predis": "1.0.1",
  ...
}

接続先をredisに

以下のページを参考、というかほぼそのままで。
PHP Master | Saving PHP Sessions in Redis

まずは、接続用のクラスを用意。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
<?php
class RedisSessionHandler implements SessionHandlerInterface
{
    public $ttl = 1800; // 30 minutes default
    protected $db;
    protected $prefix;
 
    public function __construct(PredisClient $db, $prefix = 'PHPSESSID:') {
        $this->db = $db;
        $this->prefix = $prefix;
    }
 
    public function open($savePath, $sessionName) {
        // No action necessary because connection is injected
        // in constructor and arguments are not applicable.
    }
 
    public function close() {
        $this->db = null;
        unset($this->db);
    }
 
    public function read($id) {
        $id = $this->prefix . $id;
        $sessData = $this->db->get($id);
        $this->db->expire($id, $this->ttl);
        return $sessData;
    }
 
    public function write($id, $data) {
        $id = $this->prefix . $id;
        $this->db->set($id, $data);
        $this->db->expire($id, $this->ttl);
    }
 
    public function destroy($id) {
        $this->db->del($this->prefix . $id);
    }
 
    public function gc($maxLifetime) {
        // no action necessary because using EXPIRE
    }
}

で、最初に保存先を変更するページにて以下を実行する。

1
2
3
4
5
6
7
8
9
10
11
12
<?php
require_once( dirname(__FILE__). "/vendor/autoload.php" );
require_once( dirname(__FILE__). "/RedisSessionHandler.php" );

$redis = new Predis\Client([
    'host' => parse_url($_ENV['REDIS_URL'], PHP_URL_HOST),
    'port' => parse_url($_ENV['REDIS_URL'], PHP_URL_PORT),
    'password' => parse_url($_ENV['REDIS_URL'], PHP_URL_PASS),
]);
$sessHandler = new RedisSessionHandler($redis);
session_set_save_handler($sessHandler);
session_start();

2行目はredisのライブラリを読み込むための設定。
3行目は先程作成したクラス。
で、5行目でnewしているが、ここが参考サイトから少し変えていて、Heroku Redis公式の方に合わせている。
で、後は参考サイト通りに。

これで後は普通にセッションを使えばRedisに保存されるようになる。

参考

Heroku Redis | Heroku Dev Center
PHP Master | Saving PHP Sessions in Redis
herokuでセッションの保存先をRedisにする – Qiita

   このエントリーをはてなブックマークに追加