10日で覚えるPHPのキソ 第 10 回 セッション(SESSION)
PHPのキソ(超基礎編)第 10 回は、セッション(SESSION)についてお話します。
前回、「Webページを表示するために用いられるHTTPは、要求(リクエスト)に対して応答(レスポンス)がされると通信が終了することが基本となっています」とお話しました。
しかし、ショッピングサイトなどで入力した情報は、画面遷移をして消えて(終了して)しまったら困りますよね?
そんな時に活躍するのが、今回お話しする「セッション」です。
Webサーバーと(Web)ブラウザとの間で継続した通信を行う時、このセッションといわれる機能を多用します。
セッションとは
- Webサーバーとブラウザ間で継続した通信を行うために必要な機能
- セッション機能は、クッキー機能を利用している
セッションの仕組み
セッション機能を使うには、「$_SESSION」というスーパーグローバル変数に値を格納します。
PHPはセッション変数($_SESSION)の値をWebサーバー上のファイルに保管します。
また、PHPのsession_start関数は、ブラウザから送られてくるクッキーの値をもとに、どのブラウザかを特定し、そのブラウザ専用のセッション変数を復元させます。
セッションの流れ
- 初めてのリクエスト
- セッションIDと、セッションを保持しておくセッションファイルの作成
- $_SESSIONに格納された値をファイルに書き込む
- ヘッダーとHTMLの出力をする
- Webサーバーから送られてきたセッションIDをブラウザがクッキーとして保存する
- 別ページに遷移する時、自動的にクッキーの値がWebサーバーに通知される
- セッションIDを受け取ると、session_start関数はセッション変数を復活させる
- session_start関数の後、$_SESSIONが復活する
- レスポンス
ブラウザからsession1.phpにアクセスします。
session_start関数は、初めてのアクセスか、2回目以降のアクセスかを判別します。
初めてのアクセスの場合は、「セッションID」生成します。
ここでは「ID」となっていますが、実際のセッションIDは32文字のランダムな数字です。
このセッションIDを元に、$_SESSIONに格納された値を保持するためのファイルをWebサーバ上に生成します。(この時点でファイルの中身は空です。)
PHPスクリプトの実行の完了とともに、$_SESSIONに格納された値を生成されたセッションファイルに書き込みます。
Webサーバーからブラウザにレスポンスを返す際、セッションIDがヘッダーに記載されます。
サーバーから送られてきたクッキー情報を、ブラウザが受け取って保存します。
ブラウザに保持されているクッキー値は、同じドメインにアクセスしたとき、自動的にクッキーの値(ここではセッションID)をヘッダーに記載してサーバーに通知されます。
セッションIDがクッキーによって通知された場合、session_start関数はセッションファイルから値を取り出します。
このときWebサーバーのディスク上にセッションファイルがあるかどうか確認します。
ファイルが存在した場合は、ファイルの中身を取り出して、$_SESSIONの値を復活させます。
session1.phpで設定された$_SESSIONが、session_start関数の後session2.phpでも利用することができます。
セッションの開始
- session_start関数の実行
session_start関数は、「セッションを開始しますよ」という合図です。
これを記述しないと、$_SESSION変数はセッション機能を果たしません。
セッション変数の受け渡し
$_SESSIONに値を格納すると、同一のセッションで値を共有できます。
このような変数をセッション変数と言います。
<?php
$_SESSION['one'] = 1;
?>
セッションの終了
- セッション変数の初期化($_SESSION = array(); )
- session_destroy関数の実行(セッションファイルの削除)
セッション変数を空にして、生成したセッションファイルをsession_destroy関数で削除します。
第 10 回まとめ
実際にセッションを開始してから終了するまでのプログラムを書いてみましょう
用意するのは次の3ファイルです。
- session1.php
- session2.php
- session_destroy.php
ではまずsession1.phpから
- session1.php
<?php
// セッションの開始
session_start();
// セッション変数に値を代入
$_SESSION["title"] = "PHPのキソ";
?>
<html>
<body>
<p>セッションが開始されました。</p>
<p>$_SESSION["title"]に代入した値は「<?php echo $_SESSION["title"] ?>」です。</p>
<p><a href = "session2.php">次のページ</a>に遷移してみましょう</p>
</body>
</html>
ブラウザでの表示
次にsession2.phpです。
- session2.php
<?php
// セッションの開始
session_start();
?>
<html>
<body>
<p>ページが遷移しました。再びセッションを開始します。</p>
<p>受け取ったセッション変数の値は「<?php echo $_SESSION["title"] ?>」です。</p>
<p><a href = "session_destroy.php">セッションを破棄</a>してみましょう。</p>
</body>
</html>
ブラウザでの表示
最後にsession_destroy.phpです。
- session_destroy.php
<?php
// セッションの開始
session_start();
// セッション変数の初期化
$_SESSION = array();
// セッションファイルの削除
session_destroy();
?>
<html>
<body>
<p>ページが遷移しました。</p>
<p>再びセッションを開始してから、セッションを破棄しました。</p>
<p>$_SESSION["title"]を表示してみましょう</p>
<p>$_SESSION["title"] = 「<?php echo $_SESSION["title"] ?>」です。</p> <p>セッション関数の中身が空になっていますね。</p>
<a href = "session1.php">最初に戻る</a>
</body>
</html>
ブラウザでの表示
セッション機能は、Webアプリケーションを構築する上で重要な機能です。
ログインページやショッピングカートもセッション機能を利用して作られています。
難しく感じる部分もあるかもしれませんが、ゆっくりと流れを理解していってください。
最後に…
今回をもちまして、「PHPのキソ(超基礎編)」は終了いたします。
10回にわたりご愛顧頂きましてありがとうございました。
シーブレインでは、引き続き皆様に喜んで頂けるような連載を企画しております。
ご期待くださいませ。
これからもどうぞよろしくお願いいたします。