ウェブの仕組みを理解するために、クッキーとセッションの理解は必須になります。
この記事では、この内、セッション情報の使い方を、PHPのコードで紹介します。
webにおけるセッションの使い方 基礎編
セッションとセッション情報とは
ページ間、HTTP通信間で情報を共有して、複数の通信にまとまりをもたせた一連のやり取りをセッションといいます。例えばログインして会員制サイトにアクセスしてログアウトするまでが一つのセッションとなります。
そして、セッションを成立させるための情報で、サーバー側に保存される情報をセッション情報といいます。
ウェブにおけるクッキーとセションの役割については、下の記事に書いてますので、わからない人は先に読んでおいてください。
参考記事に説明していますが、セッション情報をクライアントごとに区別するために、クッキー情報も使っています。下図のように、クライアントがセッションIDをクッキーとして持っておくことで、サーバーが対応するクライアント用のセッション情報を参照する仕組みになっています。
では、これから、PHPを使って、セッション情報を使う方法を紹介していきます。
基本的なセッション情報の読み書き
セッション情報の書き込み
セッション情報へ「session_test」キーにテキストをセットするサンプルを下リストに示します。ファイル名はset_session_info.php とします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<?php session_start(); $_SESSION['session_test'] = '内容です'.date("Y/m/d H:i:s"); ?> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>セッション情報の保存</title> </head> <body> <p>セッション情報(名前:session_test)をセットします。</p> </body> </html> |
コード解説
この中で、実際にセッション情報を記録しているのは、冒頭部分の2行だけです。
session_start() 関数は、セッション情報を作成するときや、参照するときに先頭で呼ぶルールになってます。セッションを使うための裏方処理をしてくれます。
下に公式サイトのマニュアル session_start関数 のページへのリンクです。
次の行が実際にセッション情報をセットしています。
$_SESSION配列に対してアクセスすることでセッション情報へ読み書きすることができます。
ここでは、session_test キー に 「内容です(現日時)」の文字列をセットしています。
実行結果
下図に、ブラウザから set_session_info.phpにアクセスしたときの結果を示します。
XAMPPでは、デフォルトでは、C:\xampp\tmpフォルダに、セッション情報が保存されています。
フォルダを見るとセッションIDがファイル名に書かれています。
セッションファイルをテキストエディタで開くと、下図の様に、キー「session_test」でセッション情報が保存されています。
セッション情報の読み出し
次に、セッション情報を読み出すサンプルを示します。ファイル名はread_session_info.phpとします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
<?php session_start(); ?> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>セッション情報読み出し</title> </head> <body> <?php if (isset($_SESSION['session_test'])): ?> <p>セッション情報がセットされています。</p> <p>session_test:<?=$_SESSION['session_test']?></p> <?php else: ?> <p>セッション情報はセットされていません。</p> <?php endif; ?> </body> </html> |
コード解説
セッション情報を読み出す際にも、session_start 関数を読み出します。この関数を呼ぶことによって、クッキー情報からわかるクライアントに相当するセッション情報が準備されます。
読み出し部分は、$_SESSION配列を使って、セッション情報にsession_testキーが定義されていたら、値を表示するようにしています。
実行結果
下図に、read_session_info.php にアクセスしたブラウザの結果を示します。
set_session_info.phpで設定したセッション情報が共有されています。また、クッキーでの共有と違い、ブラウザ側には、セッション情報を隠しておくことができます。また、ブラウザで変更することもできません。
例えば、ログイン認証状況などをセッション情報に保存しておくことによって、会員サイトでユーザごとに個別のサービスを行う処理を実現することができます。
セッション情報の破棄
では、次にセッション情報を破棄し、削除するサンプルを示します。ログアウトしたときなどセッションが終了したときは、セッションを破棄しておく必要があります。
サンプルのファイル名は unset_session_info.php とします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
<?php session_start(); $_SESSION = []; //空にする if (ini_get("session.use_cookies")) { $param = session_get_cookie_params(); setcookie(session_name(), '', time() - 42000, $param['path'], $param['domain'], $param['secure'],$param['httponly'] ); } session_destroy(); ?> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>セッション情報の破棄</title> </head> <body> <p>セッション情報(名前:session_test)を破棄します。</p> </body> </html> |
コード解説
セッション開始
セッション情報を使うので、最初に session_start関数を呼んでます。
セッション配列を初期化
次に、$_SESSION配列を空配列に初期化します。
セッションID用クッキーを無効化
続いて、クッキーのセッションIDを無効にしています。
ini_get関数でPHPの設定を読み出しています。設定項目「session.use_cookies」 は、クッキーをセッションIDとして使用するかを設定しています。つまり7行目はクッキーを使う設定になってるときだけ、クッキー無効化の処理をしています。
$param変数にはsession_get_cookie_params関数の出力を代入しています。session_get_cookie_params関数は、セッションID用のクッキーのパラメータを取得する関数です。これはマニュアルのリンクを載せておきますね。
読みだしたパラメータは、 setcookie でセッションIDを無効にするときに、パラメータを引数で指定するために使います。
session_name関数は、セッションID用のクッキーのキーを調べる関数です。引数を渡すと変更することも出来るようです。ここでは、この後にsetcookie関数で、セッションID用クッキーを上書きするために使ってます。
そして、この処理の最後、setcookie関数で、クッキーの期限を現在より過去にすることで、クッキーを無効にしています。
time()関数で、現在のタイミングスタンプを取得して、それよりマイナスの時刻、ここでは42000秒前なので、12時間前ぐらいをクッキーの期限に設定することで無効にしています。
※ちなみに、expire にゼロを入れると、ブラウザが閉じるまで有効になってしまいます。
セッションの削除
最後にセッションファイルを削除します。
session_destroy関数だけでやっていれば良さそうなものなのですが、PHP公式サイトのマニュアルを見ると、$_SESSIONの初期化、セッションID用クッキーの無効化もやっとくべきだとの記述があったため、上記のように、面倒な処理になってます。
たとえsession_destroy関数だけやればちゃんと消えたとしても、そうじゃないサーバ環境やPHPバージョンがあるかもしれないため、マニュアルには従っておいたほうが良いです。
下にリンク貼っておきます。
実行結果
下図がunset_session_info.php にアクセスしたときのブラウザ表示です。
デベロッパーツールのNetworkタブの情報によると、ちゃんと、サーバから送信されたレスポンスのヘッダには、Set-Cookieヘッダがついており、クッキー有効期限も過去になってます。
その状態で、read_session_info.php にアクセスしてみると、セッション情報がちゃんとクリアされていることがわかります。
ただ、一旦消されても、また、このページの読み込みでsession_start しているので、新しくセッションIDのクッキーはつくられます。一旦は消えてるので、ややこしいですが間違えないようにしてください。
まとめ
この記事では、PHPを使ってセッション情報を読み書きする方法を紹介しました。
ぜひ、実際に動かしてみてくださいね。
クッキーについても下の記事で、PHPを使った読み書きの方法を紹介していますので、よかったら一緒に理解しておきましょう。
また、記事の更新をメルマガでお知らせいたします。またそれ以外にも、プログラミングに関する裏話などもしています。よかったら下のフォームからご登録ください。
メルマガ登録フォーム
コメント