セッション

セッション関数
関数 説明
session_start 新しいセッションを開始、あるいは既存のセッションを再開する
session_cache_expire 現在のキャッシュの有効期限を返す
session_cache_limiter 現在のキャッシュリミッタを取得または設定する
session_encode 現在のセッションデータを、セッションエンコードされた文字列に変換する
session_decode セッションエンコードされた文字列からセッションデータをデコードする
session_unset すべてのセッション変数を開放する
session_destroy セッションに登録されたデータをすべて破棄する
session_get_cookie_params セッションクッキーのパラメータを取得する
session_set_cookie_params セッションクッキーのパラメータを設定する
session_id 現在のセッション ID を取得または設定する
session_name 現在のセッション名を取得または設定する
session_save_path 現在のセッションデータ保存パスを取得または設定する
session_is_registered 変数がセッションに登録されているかどうかを調べる
session_module_name 現在のセッションモジュールを取得または設定する
session_regenerate_id 現在のセッションIDを新しく生成したものと置き換える
session_register_shutdown セッションのシャットダウン関数
session_register 現在のセッションに1つ以上の変数を登録する
session_unregister 現在のセッションから変数の登録を削除する
session_set_save_handler ユーザー定義のセッション保存関数を設定する
session_status 現在のセッションの状態を返す
session_write_close セッションデータを書き込んでセッションを終了する
session_commit session_write_close のエイリアス
PHP: セッション関数 - Manual

セッション

セッションの開始

bool session_start ( void )
PHP: session_start - Manual

session_start()は、すべての出力の前に実行される必要があります。これはセッションを開始するとき、PHPはセッションIDをクッキーに書き込むためで、setcookie()を使用する場合と同様の制約となります。

すでに作成されたセッションがあるときには、session_start()はセッションの再開となり、クッキーの書き込みは行われません。

セッションの破棄

session_start();

// セッション変数を削除
$_SESSION = array();

if( ini_get( 'session.use_cookies' ) )
{
    // セッション クッキーを削除
    $params = session_get_cookie_params();
    setcookie( session_name(), '', time() - 3600, $params[ 'path' ] );
}

// セッション ファイルを削除
session_destroy();

セッションを確実に破棄するには、

  • サーバ側のセッション変数
  • セッション ファイル
  • クライアント側のセッション クッキー

を削除する必要があります。

セッション クッキーを削除するとき、ドキュメントではsetcookie(session_name(), '', time() - 42000,…)のように42000秒前の時刻を指定するようにしています。しかしクッキーを削除するには過去の時刻を指定すれば良いだけですので、42000秒前である必要は何もありません。

セッション変数

セッションの情報へは、$_SESSION配列でアクセスできます。PHP: $_SESSION - Manual

$_SESSIONを使用するには、先にセッションが開始されている必要があります。それにはphp.iniでsession.auto_startを1に設定するか、さもなくばsession_start()を実行します。

セッションを開始させない、もしくは正常に開始されていない状態でセッション変数へアクセスすると、Notice: Undefined variable: _SESSIONとなります。

$_SESSION
セッション変数を含む連想配列
セッション変数
$_SESSION[ 0 ]や $_SESSION[ 'a' ]など

セッション変数の登録

$_SESSION[ 'foo' ] = 100;

セッション変数はセッション中は有効です。よって異なるページで同一の名前のセッション変数を使用すると、上書きされることがあります。

セッション変数の破棄

unset( $_SESSION[ 'foo' ] );

unset( $_SESSION )として、すべての$_SESSIONを破棄してはなりません。

これはセッション変数を破棄する方法です、セッションを破棄するのは別の方法です。

セッションID (Session ID)

php.iniのsession.use_trans_sidが0となっている場合、セッションIDはクッキー (セッションクッキー) に保存されます。

セッションクッキー (Session Cookie)

セッションクッキーとは、セッションIDの保持に使用されるクッキーのことです。このクッキーは既定では、

セッションクッキーの既定の設定
属性
名前 PHPSESSID
ドメイン (サーバのホスト名)
パス /
有効期限 0 (セッション終了時)

となっており、session_get_cookie_params()でこの情報を確認できます。また名前 (セッション名) はsession_name()で取得できます。

セッションクッキーの設定変更

session_set_cookie_params()は、php.iniで定義されたパラメータ

  • session.cookie_lifetime
  • session.cookie_path
  • session.cookie_domain
  • session.cookie_secure
  • session.cookie_httponly

を設定します。そしてこのパラメータはクッキーを作成するときの初期値となるものであり、すでに作成されたクッキーには作用しません。よって、すでにクッキーが作成されている状態ではsession_set_cookie_params()は効果がなく、setcookie()で直接クッキーを書き換える必要があります。

void session_set_cookie_params (
    int $lifetime
    [, string $path
    [, string $domain
    [, bool $secure = false
    [, bool $httponly = false
    ]]]] )
PHP: session_set_cookie_params - Manual

session_set_cookie_params()は、必ずsession_start()の前に実行します。

セッションクッキーの有効期限の変更
session_set_cookie_params( 600 );
session_start();

前述のように、この方法ではすでにセッションクッキーが作成されている場合には効果がありません。よって、

session_start();
setcookie( session_name(), session_id(), time() + 600 );

のように直接クッキーを設定します。このときsetookie()はsession_start()より後に実行する必要があります。さもなくばsession_id()で空文字列が返され、それで既存のセッションクッキーを上書きしてしまいます。

なおセッションクッキーの有効期限は既定では0秒となっており、これは「ブラウザを閉じるまで」の意味です。

セッションの有効期限

ここで解説しているのはセッションクッキーの有効期限であり、セッションの有効期限はまた別です。セッションの有効期限はphp.iniのsession.gc_maxlifetimeで定義され、既定値は1440秒 (24分) です。session.gc_maxlifetime - Manual

セッションの有効期限 (タイムアウトまでの時間) を不用意に延ばすことは、セキュリティ面のリスクを高めることになります。