Nullyのぶろぐ

仙台で働くエンジニアの日記

1.9.6でZend_Sessionを利用する

sessionはシステム運用のさいにはほとんどの場合必須と言っても良いほど利用率が高いデータ管理機構です。

そのsessionをZend_Sessionというクラスを利用しながら、データベースに保存・管理を簡単に利用出来るようにしてみます。(公式ページに書いてることと同じようなことですが・・・)

いつも通り、zf.batもしくは、zf.shを利用し、プロジェクトを作ります。

zf create project session

プロジェクト名は仮にsessionとしておきます。

DBの準備

今回はセッションデータをDBに保存し管理していくので、DB及び保存テーブルを作成します。

phpMyAdminなどのようなDB管理ツールなどで、以下のクエリ及び構成を持ったテーブルを作成します。

CREATE TABLE `session` (

`id` char(32),

`modified` int,

`lifetime` int,

`data` text,

PRIMARY KEY (`id`)

);

上から順に、セッションID、更新日、有効期限、セッションデータの順にデータが格納されていきます。

Sessionの利用準備

Zend_Sessionを利用するさいに最低限必要なことを「config/application.ini」に定義します。

定義する内容は、データベース情報、セッションオプションの2項目です。

DBの情報を定義

まず、DBにきちんとアクセス出来るようにDBの情報を定義します。

「config/application.ini」を秀丸などのBOMが付加されないテキストエディタで開き、以下の項目を追加します。

resources.db.adapte = "PDO_MYSQL"

resources.db.params.username = "user_name"

resources.db.params.password = "pass_word"

resources.db.params.dbname = "db_name"

resources.db.params.host = "host_name"

paramsの値はそれぞれ利用するDBの環境によって変更してください。

次にセッションの定義を行います。

今回はDBを使ったセッションの管理なので、必ず、resources.dbよりも後に記述してください。

resources.session.remember_me_seconds = 864000

resources.session.use_only_cookies = true

resources.session.saveHandler.class = "Zend_Session_SaveHandler_DbTable"

resources.session.saveHandler.options.name = "session"

resources.session.saveHandler.options.primary = "id"

resources.session.saveHandler.options.modifiedColumn = "modified"

resources.session.saveHandler.options.lifetimeColumn = "lifetime"

resources.session.saveHandler.options.dataColumn = "data"

これで下準備ができました。

この他にも色々と設定する項目はありますが、最低限動作するための記述ということで細かくは記述しません。

もし気になる場合などは、こちらを参考にしていただくか、直接ソースを・・・。

※resources.*の場所はZend Frameworkのプロジェクトを利用する際に結構利用される箇所で、この部分の説明は割愛させていただきます。

Bootstrap.phpに記述していく

次はapplicatons/Bootstrap.phpに起動コードを記述していきます。

今回起動させなければならないリソース群は、DBとセッションの2項目です。

この際注意しなければならないのが、DBを先に起動させるというところです。

もし起動させていないと、変なエラーの深みにはまってしまうので、気をつけてください。

 

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap

{

// データベースリソースの起動

protected function _initDataBase()

{

$this->bootstrap("db");

}

// セッションの起動

protected function _initSession()

{

$this->bootstrap("session");

// セッションに名前空間を付与しZend_Sessionを正常に利用出来るようにする

$session = new Zend_Session_Namespace("[session_namespace]");

$session->id = 1;

Zend_Registry::set("session", $session);

}

}

 

これで、実際にinstall_url/index/indexにアクセスし、データベースを覗いてみるとdataカラムにシリアライズされたデータが格納されているのが確認できると思います。

ちょっとだけ解説

protected functionの部分が追記していく場所です。

「new Zend_Session_Namespace()」の記述部分は、Zend_Session_Abstractを継承した自作Session管理機構も利用することができます。

もし、Zend_Session_Namespaceのインスタンス生成時に名前を渡さない場合は、「default」が標準で利用されるようになります。

Zend_Session_NamespaceはZend Frameworkでセッション機構を利用する際に、名前空間を付与する事でデータの衝突などを防げるようになっています。(Module単位でセッションを管理する場合などに意外と便利だったりします。)

その後、$sessionに帰ってきたZen_Session_Namespaceインスタンスに直接IDというメンバにアクセスしデータを格納しています。($session->id = 1の部分)

このようにアクセスすることによって、データの保存・読み込みが可能です。

その後最終的に、「Zend_Registory::set()」によって、Controllerからセッション情報を簡単に読み取れるようにしています。

最後に

今回行った簡易的なセッション管理ですが、セッション管理機構を自作することもできますので、複雑なデータ管理も行えるようになっているハズです。。。

複雑なセッション管理自体を個人ではまだ行っていないので、例題のようなポストができないのが残念ですが、こういう管理の仕方もありますよ!などがあればぜひ教えていただければと思います。

また、今回のセッションデータ管理よりもこっちのが効率いいよ!などもあればぜひ!!!!!!!!!!!!!