すなばいじり

はてなブログを使って、トンピーを揃えるまで止めないブログ。ふっくらかわいい。

人力検索でのPHP(セッション)の質問に関するお話

そういえばPHPのセッション周りの質問が出ていて、コメントを残したものがあったと思い出して確認したところ、キャンセル扱いになっていたので、メモをしておきます。

b.hatena.ne.jp

 

質問の概要(うろ覚え)は、

  • ブラウザで読み込むごとにセッションのIDを変更している
  • $_COOKIE[session_name()]の値が前回読み込んだ値になっていて更新されない
  • 理由が分からない

という内容であったと思います。

 

「ユーザー管理を行う為の実装」であり、直接関係が無い部分を解説するコメントをしたのですが、書いたものが消えてしまったので、こちらに残します。

 

 

サンプル

<?php
session_start();
var_dump(session_name()); // A
echo "---\n";
var_dump($_COOKIE[session_name()]); // B
var_dump(session_id()); // C
echo "---\n";
session_regenerate_id(true); // D

var_dump($_COOKIE[session_name()]); // E
var_dump(session_id()); // F

 

AはCOOKIEに保存される名前です。特に値を設定していないので、

PHPSESSID

となります。

 

初めてのアクセスでは B,Cの値は以下のようになります。

null
string 'ub49hl71dtddo63kkuca6ltts1' (length=26)

Bはnullとなりますが、環境によっては「Notice: Undefined index」と怒られます。

 

さて、DにてセッションIDを変更して、それぞれの値をもう一度確認しましょう。
E,Fの値は

null
string '6j82gsn2cl276rmm5sv75l9d03' (length=26)

セッションIDは変わりましたが、「 $_COOKIE[session_name()] 」はnullのままとなっています。

 

 

ブラウザをリロードしてみましょう。

 

string 'PHPSESSID' (length=9)

Aは変わりません。

 

B,Cは前回の「F」の値が入っています。

string '6j82gsn2cl276rmm5sv75l9d03' (length=26)
string '6j82gsn2cl276rmm5sv75l9d03' (length=26)

 

DにてセッションIDを変更して、それぞれの値をもう一度確認しましょう。


E,Fの値は

string '6j82gsn2cl276rmm5sv75l9d03' (length=26)
string '4uquivk4q32tp1k8lamls7s057' (length=26)

このようになりました。Fのみ変更されています。

 

「 $_COOKIE[session_name()] 」は、サーバにアクセスしたときの値をそのまま保持しますので、セッションIDを変更してもそのままになります。*1

 

セッションIDはCOOKIEの値を読むのではなく、session_id()を利用しましょう。
というお話でした。

 

なお、セッションとして保持している値は、サーバ側にあります。
ブラウザ側が持っているのは「私の情報は、このIDが付いている物の中にあります」という情報のみです。

 

PHPは特に難しくありません :)

 

 

からくり熊。

NEW リズムでともだち こぐまのトンピー

NEW リズムでともだち こぐまのトンピー

 

 

*1:無理に変更しなければ