session_set_save_handler ユーザー定義のセッション保存関数を設定する &reftitle.description; boolsession_set_save_handler callableopen callableclose callableread callablewrite callabledestroy callablegc callablecreate_sid callablevalidate_sid callableupdate_timestamp 次のプロトタイプでも登録できます。 boolsession_set_save_handler objectsessionhandler boolregister_shutdown&true; session_set_save_handler は、セッションに 関連するデータを保存および取得するために使用されるユーザー定義の セッション保存関数を設定します。この関数は、PHP セッションにより 提供されるもの以外の保存方法を使用したい場合に有用です。 例えば、セッションデータをローカルデータベースに保存します。 &reftitle.parameters; この関数には二種類のプロトタイプがあります。 sessionhandler SessionHandlerInterfaceSessionIdInterface(オプション) または SessionUpdateTimestampHandlerInterface を実装したクラス、たとえば SessionHandler のインスタンスで、 これをセッションハンドラとして登録する。 register_shutdown session_write_closeregister_shutdown_function 関数として登録するかどうか。 あるいは open 以下のシグネチャを持つ callable: boolopen stringsavePath stringsessionName open コールバックはクラスのコンストラクタのようなもので、セッションを開くときに実行されます。 セッションが自動で開始したり、あるいは手動で session_start で開始させたりするときに、最初に実行されるコールバック関数がこれです。 成功した場合は &true;、失敗した場合は &false; を返します。 close 以下のシグネチャを持つ callable: boolclose close コールバックはクラスのデストラクタのようなもので、write コールバックがコールされた後で実行されます。 また、session_write_close がコールされたときにも実行されます。 成功した場合は &true;、失敗した場合は &false; を返します。 read 以下のシグネチャを持つ callable: stringread stringsessionId read コールバックは、常にセッションエンコード (シリアライズ) された文字列を返さなければなりません。何もデータを読み込まなかった場合は空文字列を返します。 このコールバックは、セッションが開始したときや session_start がコールされたときに PHP が内部的に実行します。 このコールバックを実行する前に、PHP は open コールバックを実行します。 このコールバックが返す値は、 write コールバックがストレージに渡した形式とまったく同じシリアライズ形式でなければなりません。 返された値を PHP が自動的にアンシリアライズして、スーパーグローバル $_SESSION に格納します。データの形式は serialize したものと似ていますが、実際は違う形式であることに注意しましょう。 シリアライズの方法は ini 設定 session.serialize_handler で指定します。 write 以下のシグネチャを持つ callable: boolwrite stringsessionId stringdata write コールバックは、セッションの保存や終了が必要となったときにコールされます。 このコールバックが受け取るのは、現在のセッション ID とシリアライズ後のスーパーグローバル $_SESSION です。 PHP が内部で利用するシリアライズ方法は、ini 設定 session.serialize_handler で指定します。 このコールバックに渡されたシリアライズ後のセッションデータを、 渡されたセッション ID に対応させて格納しなければなりません。 このデータを取得した read コールバックは、 write コールバックに最初に渡されたのとまったく同じ値を返さなければなりません。 このコールバックが実行されるのは、PHP のスクリプトが終了するときか、あるいは明示的に session_write_close がコールされたときです。この関数の実行後には、PHP が内部的に close コールバックを実行することに注意しましょう。 "write" ハンドラは、出力ストリームが閉じてから実行されます。 したがって、"write" ハンドラ内でデバッグ出力を行っても、 それはブラウザに表示されません。 デバッグ出力が必要なら、それをファイルに書き出すようにしましょう。 destroy 以下のシグネチャを持つ callable: booldestroy stringsessionId このコールバックが実行されるのは、 session_destroy あるいは session_regenerate_id (destroy パラメータを &true; にした場合) を実行し、セッションを破棄した場合です。 成功した場合は &true;、失敗した場合は &false; を返します。 gc 以下のシグネチャを持つ callable: boolgc intlifetime ガベージコレクタコールバックは PHP が内部で定期的に実行し、古いセッションデータを破棄します。 実行頻度は session.gc_probability および session.gc_divisor で設定します。 この関数に渡される有効期限の値は session.gc_maxlifetime で設定できます。 成功した場合は &true;、失敗した場合は &false; を返します。 create_sid 以下のシグネチャを持つ callable: stringcreate_sid このコールバックは、新しいセッション ID が必要になったときに実行されます。 パラメータは不要です。戻り値は、使っているハンドラで有効なセッション ID を表す文字列となります。 validate_sid 以下のシグネチャを持つ callable: boolvalidate_sid stringkey このコールバックは、セッションが開始された場合に実行されます。 但し、セッションID が渡され、 session.use_strict_mode が有効な場合に限ります。 key は検証する セッションID を指定します。 渡されたID のセッションが既に存在する場合、セッションID は有効です。 成功した場合は &true;、失敗した場合は &false; を返します。 update_timestamp 以下のシグネチャを持つ callable: boolupdate_timestamp stringkey stringval このコールバックは、セッションが更新された時に実行されます。 key はセッションID、 val はセッションデータを指定します。 成功した場合は &true;、失敗した場合は &false; を返します。 &reftitle.returnvalues; &return.success; &reftitle.examples; 自作のセッションハンドラ: 完全なコードは <classname>SessionHandlerInterface</classname> を参照 ここでは実行するところだけを示します。完全な例は、上でリンクしている SessionHandlerInterface のページを参照ください。 session_set_save_handler でオブジェクト指向型のプロトタイプを使っていることと、 シャットダウン関数をその parameter フラグで登録していることに注目しましょう。 オブジェクトをセッション保存ハンドラとして使うときには、この方法をおすすめします。 &reftitle.notes; write ハンドラおよび close ハンドラはオブジェクトが破棄されたあとにコールされます。 そのため、これらのハンドラでオブジェクトを使ったり例外をスローしたりすることはできません。 例外をキャッチできないのでその情報をトレースすることもできず、 例外は単純に無視されてしまいます。 しかし、オブジェクトのデストラクタではセッションを使えます。 この「ニワトリが先かタマゴが先か」の問題を解決するために、 デストラクタから session_write_close をコールできますが、より確実なのは先述のとおりシャットダウン関数を登録することです。 SAPI の種類によっては、スクリプトの終了時にセッションを閉じると 現在の作業ディレクトリが変わってしまうことがあります。これを防ぐには、 事前に session_write_close でセッションを閉じます。 &reftitle.seealso; 設定ディレクティブ session.save_handler 設定ディレクティブ session.serialize_handler register_shutdown_function session_register_shutdown 手続き型の完全なリファレンス実装は save_handler.inc を参照ください。