セッションとは?
セッション(session)と聞いて,あなたは何を思い浮かべるでしょうか。おそらく,ディスカッションを行うトークセッションや,ミュージシャンのジャムセッションなどが連想されるのではないかと思います。英和辞書を引くと,会議の開会・裁判の開廷といった意味があることもわかります。
これらに対して,すべて同じsessionという単語が使われているということは,いずれにも共通していることがあるはずです。それは何でしょうか。
答えは,「同じ場に複数のメンバーが同時に会している」ということです。トークセッションでは,意見を述べる人と聞く人とがいなくてはなりません。ジャムセッションでは,同じステージ上で同時に演奏していなければ,ミュージシャン同士のやりとりを楽しめません。開会・開廷も同じ場に会していなければ,段取りや手続きを進めることができません。
sessionという単語は,もともと「座る」という意味を持つ単語から生まれたもので,「一同で席に着く」というところから,上記のものへとその意味合いも派生していったのです。
PHPプログラムにおけるセッション
そこで,PHPプログラムにおけるセッションとは何かということですが,これは「WebサーバとWebブラウザとをつながっている状態」を意味します。「つながっている」とは,電話と同じで,相手と会話できていることをいいます。WebブラウザからのアクセスによりWebサーバからコンテンツが送信されることを,この会話に例えているわけです。
電話での会話は,地理的に相手との距離が離れていても,実質的に同じ場を共有しているといえますが,WebブラウザとWebサーバによる通信も同じ場を共有していると考えてよいでしょう。
PHPでセッションが繋がっているかどうかを確認する方法として,前回紹介したクッキーが主に用いられます(図1)。Webブラウザがクッキーをサポートしていなければ,URLにセッションIDが含まれることになります。セキュリティの面からは,クッキーによる方法が良いとされています※1。本稿でもこちらを説明していきます。
- ※1 前回紹介したとおり,クッキーにもセキュリティの問題はあるため,これで完全に安心とはいえません。
セッションの開始
つながっている状態にすることを,セッションを開始するといいます。PHPプログラムでは,session_start()を実行します。セッションを継続しておく場合にも,これを実行しなくてはなりません。
セッションはクッキーを利用して実現していますので,必ずリスト1のようにHTMLよりも先に記述してください。
リスト1 session_start()はHTMLタグよりも前に記述する
<?php
// ..........
session_start();
// ..........
?>
<html>
<!-- ..... コンテンツ ..... -->
</html>
リスト2に,セッションを開始するときに設定されるセッションIDを画面に表示する例を示します※2。実行結果は図2です。セッションIDはsession_id()という関数で知ることができます。
- ※2 セキュリティの面からは,セッションIDを画面に表示させるのは好ましいことではありませんが,説明のためにこの例を示しています。
リスト2 セッションIDを表示する
<?php
session_start();
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>セッションの開始と終了</title>
</head>
<body>
<h4>セッションの開始と終了</h4>
<?php
echo 'セッションは開始されました<br>ID = ' . session_id();
?>
</body>
</html>
セッションの切り替え
session_regenerate_id()関数によってセッションIDを変更すると,新しいセッションに切り替えられます。リスト3は,リスト2にIDを変更するためのボタンを追加したものです。実行結果を図3に示します。
リスト3 セッションIDの変更
<?php
session_start();
if ( isset( $_POST[ 'regenerate' ] ) ) {
session_regenerate_id();
}
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>セッションの開始と終了</title>
</head>
<body>
<h4>セッションの開始と終了</h4>
<?php
echo 'セッションは開始されました<br>ID = ' . session_id();
?>
<form method="post" action="<?php echo $_SERVER[ 'PHP_SELF' ]; ?>"><div>
<input type="submit" name="regenerate" value="IDを変更">
</div></form>
</body>
</html>

