セッション情報をデータベースに保存する機能か他の保存法を実装するには、 一連のユーザーレベルの保存関数を作成し、 session_set_save_handler()を使用する必要があります。 SessionHandlerInterface を使ったり、SessionHandler を継承して PHP の内部セッションハンドラを拡張したりしてセッションハンドラを作成できます。
session_set_save_handler() で指定したコールバックメソッドが、 セッションのライフサイクル内で PHP からコールされます。 セッションの open
、read
、write
、 close
、そしてセッションの削除 (destroy
) や定期的なガベージコレクション (gc
) などのときです。
したがって、PHP では常にセッション保存ハンドラが必要となります。デフォルトは、通常はファイルベースの保存ハンドラです。 自作の保存ハンドラは session_set_save_handler() で設定できます。 内部的な保存ハンドラとして、デフォルト以外のものも PHP の拡張モジュールとして用意されています。 sqlite
や memcache
そして 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
を超えているすべてのレコードを永続ストレージから削除しなければなりません。