[Zend Framework] Zend_Session_Namespace ③
前回続き。
Zend_Session、Zend_Session_Namespaceでは、セッション自体の有効期限のほかに独自で有効期限を管理しています。
有効期限の方法は、時間とHOP数(参照回数のようなもの)で指定できます。
Zend_Session_Namespaceで有効期限を設定する関数は、
- setExpirationSeconds($seconds, $variables = null)
- setExpirationHops($hops, $variables = null, $hopCountOnUsageOnly = false)
の2つで、名前のとおり前者が時間での有効期限、後者がHOP数での有効期限が設定できます。
setExpirationSeconds()の$secondsで有効期限の秒数を、$variablesで有効期限を設定する値を指定します(指定しない場合はネームスペース全体となります)。
$session_foo = new Zend_Session_Namespace('foo'); $session_foo->bar = 'bar'; $session_foo->baz = 'baz'; // ネームスーペースfooのセッションの有効期限を5分とする $session_foo->setExpirationSeconds(300); // fooのなかで、barの値だけは有効期限を1分とする $session_foo->setExpirationSeconds(60, 'bar');
上記の例では、1分後に$session_foo->bar($_SESSION['foo']['bar'])が、5分後に$session_foo($_SESSION['foo'])自体が削除されます。
setExpirationHops()は3つの引数があります。
$hopsでHOP数を指定し、$variablesはsetExpirationSeconds()同様、有効期限を設定する値を指定します。
$hopCountOnUsageOnlyはHOP数のカウントダウンに影響します。trueを指定すると、このネームスペースがインスタンス化されたときだけHOP数がカウントダウンされます。false(デフォルト)を指定すると、Zend_Session::start()がコールされる時にHOP数がカウントダウンされます。まり、他のネームスペースも含めて(Zend_Session::start()を直接コールしたときも含め)カウントダウンの対象となります。ただし、ただし、Zend_Session::start()は1リクエストで1回きりなので、1リクエスト内でHOP数が2も3も減るようなことはありません。
$hopCountOnUsageOnlyがtrueの場合
// HOP数はカウントダウンされません。 $session_foo = new Zend_Session_Namespace('bar'); // ここでHOP数はカウントダウンされます。 $session_foo = new Zend_Session_Namespace('foo');
$hopCountOnUsageOnlyがfalseの場合
// ここでHO数はカウントダウンされます $session_foo = new Zend_Session_Namespace('bar'); // すでにセッションはstart()しているので、カウントダウンされません。 $session_foo = new Zend_Session_Namespace('foo');
HOP数が0になることで有効期限が切れますが、このときは時間の場合と違ってすぐに削除されるのではなく、$_expiringDataに一時的に保存され、同リクエスト内に限りこのデータを取得したり保存したりできます。取得は、通常のセッションデータを取得する手順と同じです。
// ここでHOP数が0となった $session_foo = new Zend_Session('foo'); // $_expiringDataからデータを取得します $bar = $session_foo->bar; // 再度セッションに保存できます $session_foo->bar = $bar;
有効期限の管理は、$_SESSION['__ZF']というセッションデータ以下で管理されています。
setExpirationHops()の$hopCountOnUsageをtrueにした時の有効期限のみ、Zend_Namespaceをインスタンス化するときに確認され、そのほかの場合はZend_Session::start()をコールしたときにチェックされます(すでにセッションがスタートされているときはチェックされません)。
次回へ続く…