第44章 Zend_Session

目次

44.1. 導入
44.2. 基本的な使用法
44.2.1. チュートリアル
44.2.2. セッション名前空間の順次処理
44.2.3. セッション名前空間へのアクセス方法
44.3. 高度な使用法
44.3.1. セッションの開始
44.3.2. セッション名前空間のロック
44.3.3. 名前空間の有効期限
44.3.4. コントローラでのセッションのカプセル化
44.3.5. 名前空間内あたりのインスタンス数をひとつに絞り込む
44.3.6. 配列の使用
44.3.7. セッションでのオブジェクトの使用
44.3.8. ユニットテストでのセッションの使用
44.4. グローバルセッションの管理
44.4.1. 設定オプション
44.4.2. Error: Headers Already Sent
44.4.3. セッション識別子
44.4.3.1. セッションハイジャックおよびセッション固定化
44.4.4. rememberMe(integer $seconds)
44.4.5. forgetMe()
44.4.6. sessionExists()
44.4.7. destroy(bool $remove_cookie = true, bool $readonly = true)
44.4.8. stop()
44.4.9. writeClose($readonly = true)
44.4.10. expireSessionCookie()
44.4.11. setSaveHandler(Zend_Session_SaveHandler_Interface $interface)
44.4.12. namespaceIsset($namespace)
44.4.13. namespaceUnset($namespace)
44.4.14. namespaceGet($namespace)
44.4.15. getIterator()
44.5. Zend_Session_SaveHandler_DbTable

44.1. 導入

Zend Framework Auth team は皆さんのフィードバックや協力をお待ちしています。 メーリングリストは fw-auth@lists.zend.com です。

PHP で書かれたウェブアプリケーションでは、セッション を使用してサーバ側 (状態を保持するデータ) とクライアント側 (特定のユーザエージェント。たとえばウェブブラウザ) の論理的な一対一の関係を表します。 Zend_Session はセッションデータの管理と保持を行い、クッキーのデータを論理的に補完し、 同一クライアントからの複数ページにわたるリクエストを扱います。 クッキーのデータと異なり、セッションデータはクライアント側には保存されません。 セッションデータがクライアントと共有されるのは、 サーバ側のソースコードの脆弱性のために クライアントからのリクエストへの応答として使用できるようになった場合のみです。 このコンポーネントのドキュメントにおいて「セッションデータ」という用語は、 $_SESSION に保存されたり Zend_Session で管理されたり、 独立して Zend_Session_Namespace のアクセス用オブジェクトで管理されたりする サーバ側のデータをさすものとします。 セッション名前空間 により、セッションデータに対して昔ながらの 名前空間 を使用したアクセスが可能となります。 これは、文字列をキーとした連想配列形式で実装されています。 (通常の PHP の配列と同じです)。

Zend_Session_Namespace のインスタンスは、$_SESSION の一部を切り取って名前空間つきでアクセスするためのオブジェクトとなります。 Zend_Session コンポーネントは、PHP の既存の ext/session をラップして管理用インターフェイスを提供します。また、 Zend_Session_Namespace のセッション名前空間を持続させるための API も提供します。 Zend_Session_Namespace は、標準化されたオブジェクト指向のインターフェイスで 名前空間を扱います。これは、PHP 標準のセッションの仕組みを使用しています。 匿名セッションおよび認証済み ("ログイン") セッション名前空間の両方をサポートしています。 Zend Framework の認証コンポーネントである Zend_Auth は、 Zend_Session_Namespace を使用して "Zend_Auth" 名前空間に認証済みユーザの情報を保存します。 Zend_Session_Core が内部で使用しているのは通常の PHP ext/session 関数なので、おなじみのオプションや設定が適用されます (http://www.php.net/session を参照ください)。これは、オブジェクト指向で扱えたりデフォルトをサポートしていたりという点で Zend Framework とうまく組み合わせることができます。 したがって、クッキーに記録したり URL に埋め込まれたりする 標準のセッション ID を用いて、クライアントとセッション状態データの関連付けが行われます。

デフォルトの セッション保存ハンドラ は、クラスタ構成のサーバではセッションデータの関連性を保持できないことがあります。 セッションデータは、リクエストに応答したサーバ上に保存されるからです。 セッションデータがある場所とは別のサーバでリクエストが処理された場合は、 そのサーバからセッションデータにアクセスすることができません (ネットワークファイルシステムなどでアクセス可能になっている場合は別です)。 このような場合に対応できるような保存ハンドラを将来提供する予定です。 使用できるようになった時点でここで説明します。 保存ハンドラの案を出したり実際に作成したりした場合は、メーリングリスト fw-auth@lists.zend.com にお知らせください。 Zend_Db 互換の保存ハンドラは、このメーリングリストに投稿されます。