せかいや

いまいるここを、おもしろく http://sekai-in-the-box.appspot.com/

【PHP】「セッション情報を削除」ってどういう意味? session_regenerate_id 編

公式ガイドにはこんな記載が。

bool session_regenerate_id ([ bool $delete_old_session = false ] )
session_regenerate_id() は現在のセッションIDを 新しいものと置き換えます。
その際、現在のセッション情報は維持されます。

パラメーター:delete_old_session
関連付けられた古いセッションを削除するかどうか。

http://www.php.net/manual/ja/function.session-regenerate-id.php

「古いセッションの情報」とは何?

下記テストコードでも明らかなように、
session_regenerate_idを実行しても、スーパーグローバル$_SESSION の情報は変化がありません。
■テストコード

<?php

session_start();

// 現在のセッションIDを表示
echo session_id()."<br/>";

//セッションに情報を格納
$_SESSION['color'] = 'green';

//セッションIDを再作成
session_regenerate_id(true);

//異なるセッションIDとなる
echo session_id()."<br/>";

//セッション情報は元のまま
print_r($_SESSION);

■結果

evqeikga6u9to83c8u8aqblds5
iuik79khoaogc58imt442okcn0
Array ( [color] => green )

Cookieを指しているでもない模様

セッション名は一意(=PHPSESSID)のため、
session_regenerate_idを行うと引数の状態(=「古い情報を残すか」)にかかわらず
常にこの値をキーにしたセッション値が更新されます。
(例)
f:id:sekaiya:20130728203417j:plain

■解決

「古い情報」とはサーバーのキャッシュのこと

色々調べた結果、「古いセッション」とはサーバーのキャッシュ情報のことだと分かりました。

■テストコード ※session_regenerate_id(true)の場合

<?php

session_start();

// 現在のセッションIDを表示
echo session_id()."<br/>";

//セッションIDを再作成
session_regenerate_id(true);

// 新しいセッションIDを表示
echo session_id()."<br/>";

■結果
C:\xampp\tmpフォルダ には新しいセッションIDのファイルしか存在しない
f:id:sekaiya:20130728203732j:plain
f:id:sekaiya:20130728203704j:plain



■テストコード ※session_regenerate_id(false)の場合

<?php

session_start();

// 現在のセッションIDを表示
echo session_id()."<br/>";

//セッションIDを再作成
session_regenerate_id(false);

// 新しいセッションIDを表示
echo session_id()."<br/>";

■結果
C:\xampp\tmpフォルダ には古いセッションIDのファイルも存在する
f:id:sekaiya:20130728203719j:plain
f:id:sekaiya:20130728203723j:plain

うぬー。分かれば簡単なんだけど。。嵌った。