SessionHandler クラス
SessionHandler
&reftitle.intro;
SessionHandler は特殊なクラスで、
これを継承したクラスを作れば PHP が内部的に使っているセッション保存ハンドラを拡張できます。
このクラスには七つのメソッドがあり、それぞれが七つのセッション保存ハンドラコールバック
(open, close,
read, write, destroy, gc および create_sid)
に対応しています。デフォルトでは、このクラスは
session.save_handler で定義された内部セッションハンドラをラップします。
通常は files がデフォルトになっています。
それ以外には、PHP の拡張モジュールとして提供されている SQLite (sqlite) や
Memcache (memcache) そして Memcached (memcached) が使えます。
SessionHandler のインスタンスを
session_set_save_handler でハンドラとして指定すると、
そのインスタンスが現在の保存ハンドラをラップします。
SessionHandler を継承したクラスを作ると、
親クラスのメソッド、つまり PHP の内部セッションハンドラのメソッドをラップして
オーバーライドしたり処理を割り込ませたりフィルタをかけたりできるようになります。
これを利用すると、たとえば read と write
メソッドに処理を割り込ませ、セッションデータの暗号化/復号の処理を追加することができます。
あるいは、ガベージコレクションコールバック gc
を完全に自前の処理で置き換えてしまうこともできます。
SessionHandler は現在の内部保存ハンドラのメソッドをラップしているので、
先述の暗号化の例は任意の保存ハンドラに適用することができます。その際に、ハンドラの内部的な動きを知っておく必要はありません。
このクラスを使うには、まず最初に公開したいハンドラを
session.save_handler で設定してから、
SessionHandler あるいはそれを継承したクラスのインスタンスを
session_set_save_handler に渡します。
このクラスのコールバックメソッドは PHP が内部的にコールするものであり、
ユーザーのコードから呼ばれることは想定していないことに注意しましょう。
コールバックの戻り値も、PHP が内部的に利用するだけです。
セッションの処理の流れについての詳しい情報は
session_set_save_handler を参照ください。
&reftitle.classsynopsis;
SessionHandler
implements
SessionHandlerInterface
SessionIdInterface
&Methods;
&reftitle.notes;
このクラスは現在の PHP 内部セッション保存ハンドラを公開するように作られています。
自作の保存ハンドラを用意したい場合は、SessionHandler
を継承するのではなく SessionHandlerInterface
を実装したクラスを作るようにしましょう。
&reftitle.examples;
SessionHandler を使って PHP の保存ハンドラに暗号化機能を追加する例
key = $key;
}
public function read($id)
{
$data = parent::read($id);
if (!$data) {
return "";
} else {
return decrypt($data, $this->key);
}
}
public function write($id, $data)
{
$data = encrypt($data, $this->key);
return parent::write($id, $data);
}
}
// この例では標準の 'files' ハンドラを横取りしていますが、他のネイティブハンドラである
// PHP 拡張モジュール 'sqlite'、'memcache'、'memcached'
// の場合でもまったく同じように使えます。
ini_set('session.save_handler', 'files');
$key = 'secret_string';
$handler = new EncryptedSessionHandler($key);
session_set_save_handler($handler, true);
session_start();
// $_SESSION への値の設定や格納されている値の取得を進めます
]]>
このクラスのメソッドは、セッション処理の一環として PHP が内部的にコールするためのものとして作られています。
そのため、子クラスから親のメソッド (実際のネイティブハンドラ) をコールすると、
(自動で開始するか、あるいは session_start を実行するなどして)
セッションを実際に開始していない限りはその戻り値が &false; となります。
この点は、ユニットテストを書く際に注意が必要です。というのも、
ユニットテストではクラスのメソッドを手動でコールする可能性があるからです。
&reference.session.entities.sessionhandler;