Zend Framework [4] - Zend_Session

2007.11.12 Author: Jas

Zend FrameworkのAPIは大量にあるので、入門講座はまだまだ続きます。
今日のお題はZend_Sessionということで、セッション管理関連のお話です。

ただ、このライブラリーはまだ開発途上らしく、マニュアル上に「案を出したり実際に作成したりした場合は、メーリングリスト fw-auth@lists.zend.com にお知らせください。 」と記載があります。
セッション管理方法について、良い案があれば、ぜひメールをしてみてください。

今回紹介するSZend_Sessionですが、基本的な機能はPHPのSESSION関数と同じです。
ただ、下記に示すような追加機能があり、セッション管理がより安全になっています。

【追加機能】
1.「名前空間」機能
2.同じ名前のセッションを作成できなくできる
3.セッションをlockをし、読み取り専用にできる
4.セッション毎に有効時間を設定可能

では、実際にこれらの機能の使い方を見てみましょう。

1.「名前空間」機能
Zend_Sessionでセッションを利用するには、名前空間のインスタンスを生成する必要があります。
名前空間のキーを指定しない場合には、'Default'で名前空間が生成されます。
この$defaultは、$_SESSION['Default']に対応します。


// 引数を指定しないと'Default'で保存される
$default = new Zend_Session_Namespace();

// 引数でキーを指定する
$user = new Zend_Session_Namespace('User');

// 値を配列で指定することもできる $_SESSION['User']['name'] = 'jas'
$user->name = "jas";


キーを指定した名前空間を使用すると、個別のセッションデータごとに有効期限を設定したり、ロックをかけたり、データの破棄を行うことができるようになります。また、それぞれの名前空間には配列でデータを格納することも可能です。ただし、Zendで始まる名前空間を使えるのは、 Zend Framework に同梱されるコアコンポーネントだけです。

※PHP のマジックメソッドの実装上の理由で、バージョン 5.2.1 より前の PHP では名前空間内の配列の修正ができません。マニュアルの「31.3.6. 配列の使用」を参考にしてください。

2.同じ名前のセッションを作成できなくできる
第二引数に true を指定すると、同じ名前の名前空間を生成しようとしたときに例外が投げられるようになります。この機能を利用すると、名前空間の衝突を避け、値を上書きしてしまうようなエラーを防ぐことができるようになります。


$service = new Zend_Session_Namespace('Service', true);
$service->user = "Jas";
echo "Web Service User: ", $service->user;

try {
$service = new Zend_Session_Namespace('Service');
} catch (Zend_Session_Exception $e) {
echo "この名前空間は既に存在します";
}


このスクリプトを実行すると、最初の行で'Service'という名前空間が既に使用されているため、例外が発生し、「この名前空間は既に存在します」と表示されます。

3.セッションをlockをし、読み取り専用にできる
Zend_Sessionの便利な追加機能の一つは、セッションにロックがかけられることです。
lock()を使用してロックをかけたセッションの名前空間に値の代入をおこなおうとすると、例外が発生します。データの書き込みを行うためには、ロックの解除(unlock)を行う必要があります。また、isLocked() を使用すると、 そのセッションの名前空間がロックされているかどうかを調べることができます。
ただし、このロックは一回のリクエスト内でのみ有効となります。

// セッションに読み取り専用ロック
$service->lock();

// ロックがかかっているかどうかを判定
if ($service->isLocked()) {
try {
$service->user = "Foo";
} catch (Zend_Session_Exception $e) {
// ロックがかかっているので例外のメッセージを表示
echo $e->getMessage();
}
echo "ロックを解除します";
$service->unLock();
echo "User: ", $service->user;
}

4.セッション毎に有効時間を設定可能
もうひとつの便利な追加機能は、セッション毎の有効時間設定が可能なことです。
setExpirationSecon()を使用し、第一引数に有効時間を秒単位で指定します。


// $_SESSION['Service']["user"]は10秒で有効期限が切れる
$service->setExpirationSeconds(10, "user");


【まとめ】
Zend_Sessionを使用すると、個々のセッションをカプセル化することで、不用意なデータの上書きを防ぐことができるようになります。また、個別に有効時間も設定できるようになるので、より柔軟なセッション管理が実現可能になります。

名古屋のWebシステム開発・ネットワーク構築会社 コネクティボへ