てきとうなさいと べぇたばん

【PHP】 session_set_save_handlerについて

session_set_save_handlerについて

session_set_save_handlerは、セッションの保存関数を定義する関数である。PHPのマニュアル

失敗する条件

失敗した場合にFALSEを返す。マニュアルには、以下のように書いてある。

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

FALSEを返す条件は、どうやら以下のいずれか2パターンらしい。

  • すでにセッションが始まっている
  • 指定したコールバック関数が呼び出せない

引数の数がマニュアル通りになっていない場合には、Warningを発生させてNULLを返すようになっている

$ php -r 'var_dump(session_set_save_handler());'
PHP Warning:  Wrong parameter count for session_set_save_handler() in Command line code on line 1
PHP Stack trace:
PHP   1. {main}() Command line code:0
PHP   2. session_set_save_handler() Command line code:1
NULL

ソースを読む限りにおいては、そうなっている。PHP 5.3.22のext/session/session.cの1650行目。WRONG_PARAM_COUNTというマクロはWarningを出してからNULLを返す(厳密には何もしていないのでNULLになる)。

if (argc != 6) {
    WRONG_PARAM_COUNT;
}

if (zend_parse_parameters(argc TSRMLS_CC, "+", &args, &num_args) == FAILURE) {
    return;
}

Warningは、NULLを返す慣習があって、暗黙の了解となっているのだろうか?この辺り、ちょっとよくわからない…

session.auto_start

セッションがすでに始まっていると失敗してFALSEが返るいうことは、session.auto_startがonの場合には使えないということになる。もしもsession_set_save_handlerを使うのならば、session.auto_startはoffにしておこうと思う。

失敗した時にはFALSEが返るとは限らない

FALSEが返るとは限らないので、「失敗したかどうか」ではなく、「成功したかどうか」で判断するべきだと思う。つまり、「TRUEを返したかどうか」で判定する。

if (session_set_save_handler(...) !== TRUE) {
    // エラー返すとかthrowするとか
}