関数・クラス解説

session_set_save_handler

version:PHP 4, PHP 5, PHP 7 (公式)

ユーザー定義のセッション保存関数を設定する

公式リファレンス

書式

session_set_save_handler ( callable $open , callable $close , callable $read , callable $write , callable $destroy , callable $gc [, callable $create_sid [, callable $validate_sid [, callable $update_timestamp ]]] ) : bool

session_set_save_handler ( object $sessionhandler [, bool $register_shutdown = TRUE ] ) : bool

open ( string $savePath , string $sessionName ) : bool

close ( ) : bool

read ( string $sessionId ) : bool

write ( string $sessionId , string $data ) : bool

destroy ( string $sessionId ) : bool

gc ( int $lifetime ) : bool

create_sid ( ) : string

validate_sid ( string $key ) : bool

update_timestamp ( string $key , string $val ) : bool

説明

PHP 5.4 以降は次のプロトタイプでも登録できます。

session_set_save_handler() は、セッションに 関連するデータを保存および取得するために使用されるユーザー定義の セッション保存関数を設定します。この関数は、PHP セッションにより 提供されるもの以外の保存方法を使用したい場合に有用です。 例えば、セッションデータをローカルデータベースに保存します。

パラメータ

この関数には二種類のプロトタイプがあります。

sessionhandler
SessionHandlerInterface、 SessionIdInterface(オプション) または SessionUpdateTimestampHandlerInterface を実装したクラス、たとえば SessionHandler のインスタンスで、 これをセッションハンドラとして登録する。PHP 5.4 以降限定。
register_shutdown
session_write_close() を register_shutdown_function() 関数として登録するかどうか。
あるいは
open
以下のシグナチャを持つ callable: open コールバックはクラスのコンストラクタのようなもので、セッションを開くときに実行されます。 セッションが自動で開始したり、あるいは手動で session_start() で開始させたりするときに、最初に実行されるコールバック関数がこれです。 成功した場合は TRUE、失敗した場合は FALSE を返します。
close
以下のシグナチャを持つ callable: close コールバックはクラスのデストラクタのようなもので、write コールバックがコールされた後で実行されます。 また、session_write_close() がコールされたときにも実行されます。 成功した場合は TRUE、失敗した場合は FALSE を返します。
read
以下のシグナチャを持つ callable: read コールバックは、常にセッションエンコード (シリアライズ) された文字列を返さなければなりません。何もデータを読み込まなかった場合は空文字列を返します。 このコールバックは、セッションが開始したときや session_start() がコールされたときに PHP が内部的に実行します。 このコールバックを実行する前に、PHP は open コールバックを実行します。 このコールバックが返す値は、 write コールバックがストレージに渡した形式とまったく同じシリアライズ形式でなければなりません。 返された値を PHP が自動的にアンシリアライズして、スーパーグローバル $_SESSION に格納します。データの形式は serialize() したものと似ていますが、実際は違う形式であることに注意しましょう。 シリアライズの方法は ini 設定 session.serialize_handler で指定します。
write
以下のシグナチャを持つ callable: write コールバックは、セッションの保存や終了が必要となったときにコールされます。 このコールバックが受け取るのは、現在のセッション ID とシリアライズ後のスーパーグローバル $_SESSION です。 PHP が内部で利用するシリアライズ方法は、ini 設定 session.serialize_handler で指定します。 このコールバックに渡されたシリアライズ後のセッションデータを、 渡されたセッション ID に対応させて格納しなければなりません。 このデータを取得した read コールバックは、 write コールバックに最初に渡されたのとまったく同じ値を返さなければなりません。 このコールバックが実行されるのは、PHP のスクリプトが終了するときか、あるいは明示的に session_write_close() がコールされたときです。この関数の実行後には、PHP が内部的に close コールバックを実行することに注意しましょう。
注意: "write" ハンドラは、出力ストリームが閉じてから実行されます。 したがって、"write" ハンドラ内でデバッグ出力を行っても、 それはブラウザに表示されません。 デバッグ出力が必要なら、それをファイルに書き出すようにしましょう。
destroy
以下のシグナチャを持つ callable: このコールバックが実行されるのは、 session_destroy() あるいは session_regenerate_id() (destroy パラメータを TRUE にした場合) を実行し、セッションを破棄した場合です。 成功した場合は TRUE、失敗した場合は FALSE を返します。
gc
以下のシグナチャを持つ callable: ガベージコレクタコールバックは PHP が内部で定期的に実行し、古いセッションデータを破棄します。 実行頻度は session.gc_probability および session.gc_divisor で設定します。 この関数に渡される有効期限の値は session.gc_maxlifetime で設定できます。 成功した場合は TRUE、失敗した場合は FALSE を返します。
create_sid
以下のシグナチャを持つ callable: このコールバックは、新しいセッション ID が必要になったときに実行されます。 パラメータは不要です。返り値は、使っているハンドラで有効なセッション ID を表す文字列となります。
validate_sid
以下のシグナチャを持つ callable: このコールバックは、セッションが開始された場合に実行されます。 但し、セッションID が渡され、 session.use_strict_mode が有効な場合に限ります。 key は検証する セッションID を指定します。 渡されたID のセッションが既に存在する場合、セッションID は有効です。 成功した場合は TRUE、失敗した場合は FALSE を返します。
update_timestamp
以下のシグナチャを持つ callable: このコールバックは、セッションが更新された時に実行されます。 key はセッションID、 val はセッションデータを指定します。 成功した場合は TRUE、失敗した場合は FALSE を返します。

返値

成功した場合に TRUE を、失敗した場合に FALSE を返します。

注意

警告 オブジェクトをセッション保存ハンドラとして使うときには、 シャットダウン関数を PHP に登録しておくことが重要です。 これで、PHP スクリプトの終了時に内部的にオブジェクトを破棄する処理による副作用や、 write および close がコールされてしまうことを防げます。 一般的には、'session_write_close' を register_shutdown_function() 関数で登録しなければなりません。 PHP 5.4.0 以降では session_register_shutdown() を使えます。あるいは session_set_save_handler() をオブジェクト指向のメソッドとして実行するときに 'register shutdown' フラグを使い、SessionHandlerInterface を実装したインスタンスを渡すという方法もあります。 警告 PHP 5.0.5 以降、write ハンドラおよび close ハンドラはオブジェクトが破棄されたあとにコールされます。 そのため、これらのハンドラでオブジェクトを使ったり例外をスローしたりすることはできません。 例外をキャッチできないのでその情報をトレースすることもできず、 例外は単純に無視されてしまいます。 しかし、オブジェクトのデストラクタではセッションを使えます。 この「ニワトリが先かタマゴが先か」の問題を解決するために、 デストラクタから session_write_close() をコールできますが、より確実なのは先述のとおりシャットダウン関数を登録することです。 警告 SAPI の種類によっては、スクリプトの終了時にセッションを閉じると 現在の作業ディレクトリが変わってしまうことがあります。これを防ぐには、 事前に session_write_close() でセッションを閉じます。警告 オブジェクトをセッション保存ハンドラとして使うときには、 シャットダウン関数を PHP に登録しておくことが重要です。 これで、PHP スクリプトの終了時に内部的にオブジェクトを破棄する処理による副作用や、 write および close がコールされてしまうことを防げます。 一般的には、'session_write_close' を register_shutdown_function() 関数で登録しなければなりません。 PHP 5.4.0 以降では session_register_shutdown() を使えます。あるいは session_set_save_handler() をオブジェクト指向のメソッドとして実行するときに 'register shutdown' フラグを使い、SessionHandlerInterface を実装したインスタンスを渡すという方法もあります。

サンプル

例1 自作のセッションハンドラ: 完全なコードは SessionHandlerInterface を参照

このコードは、PHP 5.4.0 以降のバージョンで動作します。 ここでは実行するところだけを示します。完全な例は、上でリンクしている SessionHandlerInterface のページを参照ください。

session_set_save_handler() でオブジェクト指向型のプロトタイプを使っていることと、 シャットダウン関数をその parameter フラグで登録していることに注目しましょう。 オブジェクトをセッション保存ハンドラとして使うときには、この方法をおすすめします。

<?phpclass MySessionHandler implements SessionHandlerInterface{    // ここでインターフェイスを実装します}$handler = new MySessionHandler();session_set_save_handler($handler, true);session_start();// $_SESSION への値の設定や格納されている値の取得を進めます

例2 セッション保存ハンドラでオブジェクトを使う例

このコードは、PHP 5.4.0 より前のバージョンで動作します。

この例では、ファイルベースのセッションストレージをつくります。これは PHP のデフォルトのセッション保存ハンドラである files と似たものです。この例をさらに拡張すれば、 PHP がサポートするお好みのデータベースを使ってセッションを保存させるようにするのも簡単です。

シャットダウン関数 session_write_close() を、 register_shutdown_function() を使って追加登録していることに注目しましょう。 PHP 5.4.0 より前のバージョンでオブジェクトをセッション保存ハンドラとして使うときには、この方法をおすすめします。

<?phpclass FileSessionHandler{    private $savePath;    function open($savePath, $sessionName)    {        $this->savePath = $savePath;        if (!is_dir($this->savePath)) {            mkdir($this->savePath, 0777);        }        return true;    }    function close()    {        return true;    }    function read($id)    {        return (string)@file_get_contents("$this->savePath/sess_$id");    }    function write($id, $data)    {        return file_put_contents("$this->savePath/sess_$id", $data) === false ? false : true;    }    function destroy($id)    {        $file = "$this->savePath/sess_$id";        if (file_exists($file)) {            unlink($file);        }        return true;    }    function gc($maxlifetime)    {        foreach (glob("$this->savePath/sess_*") as $file) {            if (filemtime($file) + $maxlifetime < time() && file_exists($file)) {                unlink($file);            }        }        return true;    }}$handler = new FileSessionHandler();session_set_save_handler(    array($handler, 'open'),    array($handler, 'close'),    array($handler, 'read'),    array($handler, 'write'),    array($handler, 'destroy'),    array($handler, 'gc')    );// これは、オブジェクトを保存ハンドラとして使ったときの予期せぬ副作用を防ぎますregister_shutdown_function('session_write_close');session_start();// $_SESSION への値の設定や格納されている値の取得を進めます

参考

  • 設定ディレクティブ session.save_handler
  • 設定ディレクティブ session.serialize_handler
  • register_shutdown_function() - シャットダウン時に実行する関数を登録する
  • session_register_shutdown() - セッションのシャットダウン関数 (PHP 5.4.0 以降)
  • 手続き型の完全なリファレンス実装は » save_handler.inc を参照してください。
  • ワード検索


    ※入力キーワードが、関数名・説明文・タグに含まれるものを検索

    関数名アルファベット別

    A B C D E F G H I J
    K L M N O P Q R S T
    U V W X Y Z _

    最終更新一覧

    stristr
     大文字小文字を区別せず文字列を検索し、ヒット箇所以降(あるいは以前)の文字列を返却

    stripslashes
     バックスラッシュでエスケープされた文字列から、バックスラッシュを取り除く

    stripos
     大文字小文字を区別せずに文字列が最初に現れる位置を取得する

    stripcslashes
     addcslashes() でクォートされた文字列をアンクォートする

    strip_tags
     文字列から HTML と PHP のタグを除去して返却

    strcspn
     指定した文字が最初に現れる位置を調べる

    strcoll
     ロケールに基づいて2つの文字列を比較し同じか(あるいは大小)を判定する

    strcmp
     2つの文字列を比較し同じか(あるいは大小)を判定する

    strchr
     strstr() のエイリアス

    strcasecmp
     2つの文字列を比較(大文字小文字を区別せず同じとみなす)

    カテゴリー一覧

    PHP の振る舞いの変更
    音声フォーマットの操作
    認証サービス
    コマンドライン関連
    圧縮およびアーカイブ
    暗号
    データベース関連
    日付および時刻関連
    ファイルシステム
    自然言語および文字エンコーディング
    画像処理および作成
    メール関連
    数学
    テキスト以外の MIME 型
    プロセス制御
    その他の基本モジュール
    その他のサービス
    検索エンジン用の拡張モジュール
    サーバー固有のモジュール
    セッション関連
    テキスト処理
    変数・データ型関連
    ウェブサービス
    Windows 用のモジュール
    XML 操作
    GUI用の拡張モジュール