セッションバックエンドの選択 | Session

デフォルトのセッションオブジェクトは Sabel_Session_PHP であり、これはPHP標準のセッション機構をラップしたものです。つまり、セッションデータはファイルに保存されることとなります。 しかしWebサーバが複数台から構成される場合など、MemcachedサーバやDatabaseサーバにセッションデータを格納したいことがあるかもしれません。Sabelではそのために、Sabel_Session_Memcache や Sabel_Session_Database クラスを提供します。

セッションオブジェクトはSessionプロセッサ内で生成され、バスに乗せられます。
<?php

class Processor_Session extends Sabel_Bus_Processor
{
  public function execute(Sabel_Bus $bus)
  {
    if (!$bus->has("session")) {
      $bus->set("session", Sabel_Session_PHP::create());
    }
  }
  
  public function shutdown(Sabel_Bus $bus)
  {
    ...
  }
}
上記のSabel_Session_PHP::create()の部分を変更することで、セッションデータの保存先を変更することができます。

Memcache

バックエンドをMemcachedサーバとする場合は Sabel_Session_Memcacheクラス を使用します。create()メソッドの第1引数はホスト名(またはIPアドレス)、第2引数はポート番号となります。第1引数を省略した場合は localhost が、第2引数を省略した場合は 11211 が使用されます。
$session = Sabel_Session_Memcache::create("memd.example.com", 22122);

データベース

バックエンドをデータベースとする場合は Sabel_Session_Databaseクラス を使用します。create()メソッドにはセッションデータを保持するモデル名を渡します。省略時は "SblSession" です。
$session = Sabel_Session_Database::create("MySessionModel");
バックエンドにデータベースを選択した場合は、セッションデータを格納するためのデータベース(テーブル)が必要となります。そのテーブルを作成するためのマイグレーションファイルが migration/system/N_SblSession_create.php にあるので、それを適切なマイグレーションファイル番号でコピーしてください。例えば現在5番までのマイグレーションファイルが存在するなら、下記のようにファイルをコピーします。

$ cd /path/to/project
$ cp migration/system/N_SblSession_create.php migration/default/6_SblSession_create.php
$ sakle Migration development head
マイグレーションファイルに関してはこちらを、マイグレーションの実行に関してはこちらを参照してください。

アプリケーションで使用するデータベースとセッション用データベースが異なる場合があるかもしれません。例えばセッション用データベースのコネクションネームがsesdbだとした場合、まずsesdb用の接続設定を追加します。
$params = array(
  "default" => array(
    ...
  ),
  "sesdb" => array(  // <- sesdb用の設定を追加
    ...
  )
);
コネクションネームが "sesdb" なのでコピー先も sesdbディレクトリ となります。
$ cd /path/to/project
$ mkdir migration/sesdb
$ cp migration/system/N_SblSession_create.php migration/sesdb/1_SblSession_create.php
$ sakle Migration development head sesdb
そして、モデルがセッション用データベースへ接続するために、コネクションネームの設定を行います。
app/models/SblSession.php

class SblSession extends Sabel_Db_Model
{
  protected $connectionName = "sesdb";
}
全てのセッションオブジェクトは Sabel_Session_Interface を実装しているため、セッションオブジェクトを
変更したからといって使用方法が変わることはありません。インターフェイスに関しては前章を参照してください。

関連項目