Webアプリケーションにおけるセッションとは、「ユーザーのアクセスに対してユーザー毎に変数を保持する」、「複数のページ間で、変数の共有を可能にする」とあります。Webサイトを訪れた訪問者が行う一連の行動や、その行動を通じてやり取りされる情報などがセッションにあたります。
PHPでは、セッションを理解することが重要なポイントになるので、ここではセッション管理の仕組みを分かりやすく解説していきます。
クッキーの章でも解説しましたが、Webデータのやり取りには、HTTPプロトコルというWebブラウザとWebサーバ間で交わされるインターネットプロトコルが使用されています。HTTPプロトコルには、状態を保持する機能がなく、ユーザー(ブラウザ)が連続的に複数回のアクセス(Webページの表示)をしても、サーバ側はそれを特定のユーザーの連続したアクセスと認識せず、複数のユーザーが複数回アクセスしたものとして認識します。
そこで、Webサイトに、特定のユーザーからの状態(アクセス履歴や、入力したデータなどの情報)を保持した上で、次にそのユーザーがアクセスしたときに、特定のユーザーからのアクセスであることをサーバ側が認識できるような機能を持たせるようにします。これをセッション管理といいます。
まず、ユーザーを特定するための仕組みとして、通常は初回アクセス時のユーザー対して、サーバ側からユーザーに対して自動的に識別コードを割り振り、その識別コードを使用してユーザーを特定します。この識別コードのことをセッションIDといいます。
ユーザー(ブラウザ)は、そのWebサイトにアクセスする度に、毎回必ずセッションIDを送信する必要があります。セッションIDは、注)通常クッキーとしてブラウザに記憶され、Webサイトにアクセスするときにはブラウザが自動的に送信してくれます。セッションIDを使用してユーザーを識別できるようになれば、そのセッションIDをキーにして、サーバー側で情報を保存する場所を用意します。
注)すべての環境でクッキーが使用可能なわけではありません。例えば携帯端末やブラウザでも、クッキーを無効にしているときはクッキーにセッションIDはセットされません。このような場合には、URLの一部にセッションIDを埋め込む方法があります。セッションIDを含むURLでサーバにアクセスすることで、サーバ側でセッションを識別することができます。

通常、変数は複数のページ間で共有できません。また、ページのリロードによってもリセットされてしまいます。しかし、ここでいう変数はセッションを利用する事で、複数ページ間での共有や、複数回のリロードでも保持することができます。このような変数をセッション変数と呼びます。
具体的に、Webのショッピングサイトを例にすると、ユーザーは「商品の選択」「他の商品を検索」「選択した商品の取り消し」など、サイト内のページをいろいろ移動したあと、「レジ(精算画面)」に移ります。このときに、どの商品を選択したかの情報をどこかに蓄積しておかないと、レジで金額計算ができなくなってしまいます。そこで、選択された商品などをセッション情報としてセットしておき、ユーザーがサイトに滞在している間は保持しておくような仕組みが必要になります。

ショッピングサイトで必要な情報には、「ユーザーは誰か」「何と何をいくつ買ったか」などがあります。そして、このことを判断するためにセッションIDとセッション変数があるのです。「ユーザーは誰か」というユーザーの識別にはセッションIDが、「何と何をいくつ買ったか」という購入商品などの情報にはセッション変数がそれぞれ用いられます。

おおまかなセッション管理の仕組みがわかったところで、簡単にセッションを含むスクリプトを記述してみます。
<?php
session_start();
if( isset( $_SESSION[ "count" ] ) ) {
$_SESSION[ "count" ]++;
} else {
$_SESSION[ "count" ] = 1;
}
?>
<html>
<body>
あなたは
<?php echo htmlspecialchars( $_SESSION[ "count" ] ) ?>
回目の訪問です
<a href="<?php echo htmlspecialchars( $_SERVER[ "PHP_SELF" ] ) ?>">ページを更新する</a>
</body>
</html>
あなたは 1 回目の訪問です ページを更新する あなたは 2 回目の訪問です ページを更新する
上記のスクリプトでは、まずセッションをスタートさせるsession_start()関数を呼び出します。session_start()関数は、通常、セッション対象ファイルの先頭で呼び出す必要があります。
そして、「count」という名前の変数を、セッション間でのセッション変数名として登録します。セッション変数に入れた値は、PHPのプログラムが終わる際、サーバー内に自動的に保存されます。
「ページの更新」には、指定したリンク先に移動させるリンクタグを使用して、リンク先には、自分自身のファイル(パス)を表す注)$_SERVER["PHP_SELF"]を指定しています。これにより、「ページの更新」をクリックすると再度上記のスクリプトが読み込まれ、2回目以降のアクセスの際には、session_start()関数がサーバー内に保存されたデータを元に、$_SESSION変数の復元を行います。
一度目のアクセス時には、「あなたは 1 回目の訪問です ページの更新」が、二度目のアクセス時には「あなたは 2 回目の訪問です ページの更新 」と表示されます。
現在実行しているスクリプトのファイル名を意味し、「http://php.xenophy.com/index.php」であれば「/index.php」が返されます。
補足ですが、「htmlspecialchars( $_SESSION[ "count" ] ) 」の「htmlspecialchars」は、HTMLにおいて特殊な意味を持つ文字を、そのまま表示できるようHTMLの表示形式に変換します。以下に変換対象となる文字を一部記載します。
| 変換される文字 | 変換された後の文字 | 内容 |
|---|---|---|
| & | &amp; | 常時変換される |
| < | &lt; | 常時変換される |
| > | &lt; | 常時変換される |
| " | &quot; | quote_styleの設定による。デフォルトでは変換される。 |
| ' | &#039; | quote_styleの設定による。デフォルトでは変換されない。 |
セッション管理において、特定のユーザーを識別するために、サーバ側から割り当てられる識別コードを、セッションIDといいます。それでは、サーバ側から割り振られるセッションIDとは、具体的にどのようなものなのでしょうか。
id67934741a80ab0ab9248569eb9492acc
上記のように、セッションIDには一見すると意味不明な文字列が割り振られます。
基本的に、セッションIDは第3者に推測されるような内容であってはいけません。セッションIDが推測されてしまうと、第3者が誰かのセッションIDを利用して、あたかもそのセッションIDが割り振られた本人としてアクセスできてしまいます。
そうなると、第3者が他人の個人情報を盗み見ることや、書き換えることができ、あるいはその人の権限で何らかの処理を実行できてしまうかもしれません。
この他人になりすますような不正アクセスを防ぐために、サーバでは上記のようなランダムな文字列が生成されて割り当てられます。
クッキーでセッションIDを保存する場合には、標準ではサーバ上の「tmp」というディレクトリに「sess_id67934741a80ab0ab9248569eb9492acc」のようなファイル名で保存されます(ここではxampp下のtmpフォルダに保存しています)。

