第11章 クッキーとセッションを利用しよう

11.3 セッションの仕組みを理解しよう

前項で自身のPC内に有効期限付きで、データを保存するクッキーについて学習しました。クッキーで情報を共有するには色々な制限があり、大量のデータを一時的に保存するには向きません。そのような場合クッキーの代わりに利用できる「セッション(Session)」という仕組みが用意されています。

11.3.1 セッションについて

セッションを簡単に説明すると「サーバ内に情報を保存し、複数ページ間で共有する」仕組みのことです。
例えば、ショッピングサイトで利用されるカート機能などは、複数の商品ページを遷移し、カートに追加した各商品の情報をずっと保持している必要があります。このような場合にセッションにデータを登録することで、他の画面に遷移してもデータを取り出し利用することができるのです。
セッションでは下の図のようにデータを共有することができます。


図 11.3.1: セッションでデータ共有の流れ

  • セッション情報はサーバ内に保存される。
  • 保存された情報はブラウザ単位で管理される。
  • セッションの有効期限は固定されている。(ブラウザを閉じるまで、設定ファイルで決められた時間)
  • セッションに格納する情報は、プログラムのデータ形式(文字、数値、配列…)のまま保存できる。
  • セッションに保存できるデータ量と個数にほぼ限界はない。(最大はディスク容量まで)
  • セッション情報がどのクライアントの情報なのかを関連づける仕組みは、クッキーに登録したセッションIDで管理している。※この仕組みは次の項で詳しく説明します。

セッションとクッキーの違いを、まとめた以下の表も参考にして下さい。

表 11.3.1:セッションとクッキーの特徴の違い

11.3.2 セッションを管理する仕組み

Webアプリケーションを使ってセッションを利用すると、自動的にセッションIDと呼ばれる一意のIDが発行されます。このセッションIDはセッションに登録されたデータに紐付けられるとともに、クッキーに保存されます。セッションIDが登録されたブラウザは、Webアプリケーションにアクセスする際にセッションIDを送信するため、サーバ側ではこのIDを確認することで一連のアクセスであることが認識できるようになります。

セッションを利用すると自身では登録した覚えのない「PHPSESSID」という名前のクッキーが登録されます。自動的にクッキーに登録された「PHPSESSID」がセッションIDを保持しています。セッションIDをクッキーで保存しているため、Webブラウザでクッキー設定を無効にされるとセッションも利用できなくなるので注意が必要になります。


図 11.3.2:クッキーに登録されたセッションID

このクッキーに登録されたセッションIDとサーバ上のセッションデータの関係は次のようになります。
まず、プログラムにアクセスしセッションを利用するとセッションIDが生成され、最初の画面の表示と同時にクッキーに登録されます。その際、サーバ上のセッションのデータにも同じセッションIDが紐付けられます。


図 11.3.3: セッションIDをクッキーへ登録

2回目以降のアクセス時には、リクエストと一緒にサーバに送信されたクッキー(セッションID)をもとに、セッションのデータを参照することができます。


図 11.3.4: セッションデータの参照

クッキーに登録されたセッションIDの有効期限は、ブラウザを閉じるまでか設定ファイルで定められた時間までです。そのため、ブラウザが閉じられた(セッションが切れた)後のアクセスでは、クッキー内のセッションIDは無効となり、Webアプリケーションから新しいセッションIDが発行されます。そのため、古いセッションIDのデータは参照できなくなります。


図 11.3.5: ブラウザを閉じて再アクセス

同じブラウザを複数起動している場合の注意

同じブラウザを複数起動している場合、セッションIDが共有されるため、ブラウザを1つ閉じただけではセッションが切れない場合があります。セッションを切って再アクセスが必要な場合は、同じブラウザを全て閉じてから再アクセスしましょう。

11.3.3 セッションを利用してみよう

セッションをプログラムで扱いたい場合もクッキーと同様に、組み込み関数とスーパーグローバル変数を利用すれば行えるようになっています。ただ、セッションを利用する場合は、必ずセッションを利用するための開始宣言が必要になります。

書式:セッション利用の開始宣言

この関数を1行記述するだけで、セッションを利用する準備は完了になります。逆に忘れてしまうと、セッションに格納したデータを利用できないので注意が必要です。また、session_start関数もsetCookie関数同様に、「必ずHTML文章よりも先に記述する」ルールがあることも合わせて覚えておいて下さい。

セッションの開始宣言を行った後は、スーパグローバル変数を利用してデータの保存や取得を行います。

書式:セッションへ保存と取得

スーパーグローバル変数$_SESSIONを利用して、キー文字列は任意で設定します。

凡例:セッションへ保存と取得

セッションへはプログラム内で扱えるデータ形式なら、なんでも保存することが可能になっています。データ形式がそのままなので、他のページでそのデータを扱う場合セッションから取り出して直ぐにプログラムで使えるため大変便利になっています。

セッション情報は保存後直ぐに使える

クッキー情報は次のリクエスト送信からでないと利用できません。しかし、セッションは保存処理を行ったリクエスト時からでも保存した情報を直ぐ利用することができます。セッション情報は複数のページ間で利用することを前提としていますが、自身の処理内で利用しても構いません。

それでは、セッションを使ったプログラムを見てみましょう。

セッションに保存した情報を複数のページで利用するプログラム

Web画面を複数用意して、入力画面の情報をセッションに保存して複数画面で利用できることを確認します。
このプログラムは3つの画面で構成されます。
①フォームに入力する画面:sessionForm.php
②入力データを確認する画面:sessionConfirm.php
③入力の結果を表示する画面:sessionResult.php
セッション情報は②で保存して、①~③全ての画面で利用します。

ソース・フォルダー: myproj_basic/ch11
パッケージ: sessionForm.php
アクセスURL:http://localhost/myproj_basic/ch11/sessionForm.php

sessionForm.php

ソース・フォルダー: myproj_basic/ch11
パッケージ: sessionConfirm.php
アクセスURL:sessionForm.phpからの画面遷移でアクセスされる

sessionConfirm.php

ソース・フォルダー: myproj_basic/ch11
パッケージ: sessionResult.php
アクセスURL:sessionConfirm.phpからの画面遷移でアクセスされる

sessionResult.php

実行結果

初期画面(セッション情報が無い場合)

初期画面からデータを入力して送信ボタンを押す

解説

このプログラムは3つの画面でセッション情報を利用して情報の共有を行っています。画面遷移から見る処理の流れは以下の図のようになります。


図 11.3.6: セッションを複数画面で利用した画面遷移イメージ

上記の図を参考に各ファイルのソースコードについて、詳しく解説していきます。まずは入力画面の「sessionForm.php」です。
3行目でセッションを利用するための宣言を、session_start関数を利用して行います。この記述がないとセッション情報は利用できないため、必ずこの関数を呼び出します。

6~22行目はisset関数を使ってセッションに情報が保存されているか確認しています。保存されているセッション情報には$_SESSION[‘キー文字列’]でアクセスできます。ここでセッションの情報があればifブロックの処理を、無ければelseブロックの処理を行い、入力画面の表示用の各変数に初期値を代入します。※セッション情報の保存は別画面の「sessionConfirm.php」で行われます。

6行目の処理でセッション情報があれば、ifブロック内の7~16行目の処理を行います。
8行目はセッションに格納された配列データ(添え字0)から、お名前の情報を取得して変数に代入します。
10~16行目はセッションに格納された配列データ(添え字1)から、性別の情報を取得してラジオボタンのどちらかを選択状態にするための条件判定を行っています。男性なら$manに、女性なら$womanに「checked」を設定します。

31~33行目でこれまでの処理結果で決まった変数を、ショートタグを使って埋め込みます。type=”text”にはvalue属性に埋め込み、type=”radio”はタグ内に「checked」属性が記述されれば選択状態にすることができます。

続いて確認画面の「sessionConfirm.php」の解説を行います。
この処理内でもセッションを利用するため、3行目で忘れずにセッションの開始宣言を行います。

6行目でスーパーグローバル変数$_SESSIONを使い、入力画面からのPOSTデータ(名前と性別)を配列データで保存しています。保存する際のキー文字列は「inputData」にしています。これは、データを取得する際にも利用するため間違えずに覚えておく必要があります。

16、17行目ではセッションに保存した入力情報を利用して、確認用のデータとして画面に表示しています。クッキーとは違いセッション情報は保存してすぐ利用できます。

最後の結果画面の「sessionResult.php」の解説を行います。
この処理内でも当然セッションを利用するため、3行目で忘れずにセッションの開始宣言を行います。

12行目でセッション情報からお名前と性別を取得して画面に表示しています。

今回のプログラムのように複数ページ間で利用したい情報は、セッションを使うと簡単に共有することができます。

セッションはブラウザが閉じられない限りは有効なので、無関係なWebページに行ってもデータが保持されています。もし、セッション情報を1度削除したい場合は、ブラウザを全て終了させて下さい。


図 11.3.7: セッション情報保存の確認

11.3.4 セッションを削除してみよう

セッション情報は設定ファイルで定められた時間まで経過するか、ブラウザが閉じられるまで有効です。しかし、セッション情報をそのままずっと保持していれば良いケースだけではありません。
例えば、ネットショッピングサイトで欲しいものを選んで(カートに追加)会計まで済ませたのに、また商品を選んでカートの中を見ると「前回の買い物情報が残っている」ことになってしまいます。実際私たちがネットショッピングを利用した場合はこのようなことはありません。なぜなら、セッションが自動で切れるのを待っているのではなく、1回の会計が終わったらカート情報(セッション情報)を削除する処理をきちんと行っているからなのです。

セッション情報を削除する方法も、組み込み関数に用意されています。

書式:セッション情報の削除

セッション操作関数($_SESSION変数を利用する場合も)を利用する場合にも、必ず初めにsession_start関数を利用しておく必要があります。忘れてしまうとエラーになるので注意して下さい。

unset関数は引数で指定した変数を削除してくれるので、任意のセッション情報を削除することができます。session_destroy関数を利用すると、全ての情報をまとめて削除してくれます。
セッション情報の消したい状況に応じて、2つの関数を使い分けるようにして下さい。

それでは実際にセッションを削除するプログラムを見て行きましょう。

セッション情報を削除するプログラム

セッションを使ってカウントを数える画面を用意し、その画面から「セッション削除」ボタンと「別の画面に移動」ボタンを配置します。別の画面に移動ボタンで画面遷移して戻ってきた場合「セッション情報は保持され」、削除するボタンを押して戻ってきた場合「セッションの情報が削除されている」ことを確認します。

このプログラムは3つの画面で構成されます。
①セッション情報のカウント数を表示する画面 :sessionCount.php
②セッション情報の操作も何もしない別の画面 :sessionPageMove.php
③セッション情報を削除する画面 :sessionDelete.php
セッション情報は①で保存して取得し、②に来るとセッション情報を削除します。

ソース・フォルダー: myproj_basic/ch11
パッケージ: sessionCount.php
アクセスURL:http://localhost/myproj_basic/ch11/sessionCount.php

sessionCount.php

ソース・フォルダー: myproj_basic/ch11
パッケージ: sessionPageMove.php
アクセスURL:sessionCount.phpからの画面遷移でアクセスされる

sessionPageMove.php

ソース・フォルダー: myproj_basic/ch11
パッケージ: sessionDelete.php
アクセスURL:sessionCount.phpからの画面遷移でアクセスされる

sessionDelete.php

session_destroy関数とスーパーグローバル変数$_SESSION

session_destroy関数は、現在のセッションに 関連づけられた全てのデータを破棄しますが、スーパーグローバル変数$_SESSION自体は破棄しません。そのため、session_destroy関数を利用したファイル内であれば、セッション変数内に格納されたデータを利用することができてしまいます。
session_destroy関数を利用した直後から全てのデータを破棄しておきたい場合には、セッション変数の中身自体を削除する必要があります。

実行結果

解説

このプログラムでは3つ画面を用意していますが、1つの画面だけでセッション情報を保存・取得を行いカウント数を画面に表示します。残りの画面は、PHP処理を何もしない画面(別の画面に移動して戻ってきてもセッション情報が保持されているのを確認する用)とセッション情報を削除する画面になっています。


図 11.3.8: セッション削除処理の画面遷移イメージ

上記の図を参考に、各ファイルのソースコードについて解説していきます。
まず「sessionCount.php」はセッションを利用するため、3行目でsession_start関数を利用します。

6~12行目でセッション$_SESSION[‘count’]が保存されているのか、isset関数を使って確認しています。なければelseブロックで初めてセッションにカウント数「0」を保存し、あれば$_SESSION[‘count’]に保存されたカウント数を1増やす(インクリメント)処理を行っています。

19行目の処理でセッションに保存されているカウント数を画面に表示しますが、6~12行目の処理によってセッションがない状態でアクセスすれば「0」を、あれば「前回の表示+1」のカウント数が画面に表示されることになります。

20~38行目は普通のHTML文章ですが、少し説明をしておきます。ここでテーブルタグを利用している理由は、フォームタグを3つ記述しただけだと、フォーム部品のボタンが横にではなく縦に3つ並ぶことになるからです。そこでテーブルタグで1行(<tr>)のセル(<td>)の中にフォームタグを記述することで、ボタンを横に並べて画面に表示することができます。

sessionPageMove.phpはPHP処理を何も行わず、sessionCount.phpへ戻るボタンを設置している画面です。このファイルは別の画面に遷移して元の画面に戻っても、セッションが保存され続けていることを確認する目的になっています。

sessionDelete.phpはセッションを削除する処理と、sessionCount.phpへ戻るボタンを設置している画面です。
6行目でsession_destroy関数を使ってセッション情報を削除していますが、この関数を使う前にはセッション利用の開始宣言が必要なので3行目でsession_startを記述しています。
今回のプログラムではsession_destroy関数を使って削除を行いましたが、保存しているデータは1つ(カウント数)のみなので「unset($_SESSION[‘count’])」と記述しても同じ結果を得ることができます。

実行結果から分かるように、セッションの削除を任意で行えることが確認できました。セッション情報を上手に操作して、Webアプリケーションを作成できるようにしましょう。

NEXT>> 11.4 本章のまとめ