端くれプログラマの備忘録 PHP [PHP] セッションの基本的な使い方

[PHP] セッションの基本的な使い方

基本的な操作を簡単にまとめておく。

セッションの開始

session_start関数をコールする。

セッションがまだ開始されていない場合は、セッションIDが割り当てられて新しいセッションが開始される。具体的には、サーバーで生成されたセッションIDがブラウザに送られ、”PHPSESSID”という名前でクッキーに保存される。サーバー側では、セッション変数を保存するための作業ファイルが作成される。

既にセッションが開始されている場合は、クッキーに保存されているセッションIDのセッションが利用できるようになる。

session_start();
if (!isset($_COOKIE['PHPSESSID'])) {
    echo "new session";
} else {
    echo "existing session = {$_COOKIE['PHPSESSID']}";
}

“PHPSESSID” という名前はPHPにおけるデフォルト設定である。サーバーによっては、異なる名前に変更されているかもしれない (php.ini を編集することで変更できる)。プログラム中で “PHPSESSID” の文字列を直接指定する代わりに、session_name関数を使うことで、環境に依存しないプログラムが書けるだろう。 サーバー上に作成される作業ファイルにはセッションIDの名前が付いている。僕のXAMPP環境では、セッションID “ddsuj7031ir4eqk7h6oivs9215″ に関して、C:xampptmpsess_ddsuj7031ir4eqk7h6oivs9215 というファイルが作成されていた。新しいセッションが始まったばかりの状態では中身は空である (ファイルサイズはゼロ)。

セッション変数の読み書き

セッション変数はグローバル配列 $_SESSION 経由でアクセスする。

$_SESSION['time'] = time();
$_SESSION['date'] = date("Y-m-d H:i:s", time());
$_SESSION['memo'] = "hello. how are you doing?";

print_r($_SESSION);
Array
(
    [time] => 1406669753
    [date] => 2014-07-29 23:35:53
    [memo] => hello. how are you doing?
)

サーバー上の作業ファイルを覗いてみると、セッション変数が以下のように格納されていた。

time|i:1406669753;date|s:19:"2014-07-29 23:35:53";memo|s:25:"hello. how are you doing?";

セッション変数やセッションの削除

特定のセッション変数を削除したければ、$_SESSION 配列からその要素を削除すればよい。

if (isset($_SESSION['memo'])) {
    unset($_SESSION['memo']);
}

全てのセッション変数を削除したければ、$_SESSION配列そのものを空にしてやればよい。

$_SESSION = array();

セッションを終了してデータを残骸無しに削除したければ、以下の全てを削除するべきである。

  • クッキー (セッションID)
  • グローバル変数 ($_SESSION配列)
  • セッションデータ (サーバーの作業ファイル)
// セッション変数の削除
$_SESSION = array();

// クッキーの削除
if (isset($_COOKIE['PHPSESSID'])) {
    setcookie('PHPSESSID', '', time()-60);
}

// セッションデータの削除
session_destroy();

セッションIDの再生成

サーバーに格納されているセッションデータは、セッションIDが漏れることで第三者にセッションを乗っ取られる危険性を秘めている (セッションハイジャックと呼ばれる)。そこで、同じセッションIDを長時間使うことを避け、頻繁にセッションIDを変更することが推奨される。 これを行うためにsession_regenerate_id関数が用意されている。この関数をコールすることで、現在のセッションのデータを保持したまま、セッションIDを新しくすることができる。

session_start();
$old_id = session_id();

echo "old session = {$old_id}\n";
print_r($_SESSION);

session_regenerate_id(true);
$new_id = session_id();

echo "new session = {$new_id}\n";
print_r($_SESSION);

セッションハイジャックのリスクに関しては、また別の機会に考察してみたい。

参考サイト

PHP: Sessions – Manual
http://php.net/manual/ja/book.session.php