CakeFest 2024: The Official CakePHP Conference

カスタムセッションハンドラ

セッション情報をデータベースに保存する機能か他の保存法を実装するには、 一連のユーザーレベルの保存関数を作成し、 session_set_save_handler()を使用する必要があります。 SessionHandlerInterface を使ったり、SessionHandler を継承して PHP の内部セッションハンドラを拡張したりしてセッションハンドラを作成できます。

session_set_save_handler() で指定したコールバックメソッドが、 セッションのライフサイクル内で PHP からコールされます。 セッションの openreadwriteclose、そしてセッションの削除 (destroy) や定期的なガベージコレクション (gc) などのときです。

したがって、PHP では常にセッション保存ハンドラが必要となります。デフォルトは、通常はファイルベースの保存ハンドラです。 自作の保存ハンドラは session_set_save_handler() で設定できます。 内部的な保存ハンドラとして、デフォルト以外のものも PHP の拡張モジュールとして用意されています。 sqlitememcache そして memcached などで、これらは session.save_handler で設定できます。

セッションが開始するときに、PHP は内部的に open ハンドラをコールします。 それに続けて read コールバックを実行し、 このコールバックがエンコードされた文字列を返します。これは最初にセッションストレージに渡されたものと同じ形式になります。 read コールバックがエンコードした文字列を返したら、 PHP がそれをデコードしてデコード後の配列をスーパーグローバル $_SESSION に格納します。

PHP のスクリプトが終了するとき (あるいは session_write_close() がコールされたとき) には、 PHP が内部的にスーパーグローバル $_SESSION をエンコードします。 そして、それをセッション ID とともに write コールバックに渡します。 write コールバックが終了すると、PHP は内部的に close コールバックハンドラを実行します。

セッションが明確に破棄されたときには、PHP は destroy ハンドラをセッション ID つきでコールします。

PHP はときどき gc コールバックを実行し、 設定されているセッション有効期限にもとづいて期限切れのセッションレコードを無効化します。 この処理では、最後にアクセスされてからの時間が $lifetime を超えているすべてのレコードを永続ストレージから削除しなければなりません。

add a note

User Contributed Notes 1 note

up
-56
tony at marston-home dot demon dot co dot uk
5 years ago
Your custom session handler should not contain calls to any of the session functions, such as session_name() or session_id(), as the relevant values are passed as arguments on various handler methods. Attempting to obtain values from alternative sources may not work as expected.
To Top