解 説

セッションとは

変数の寿命はページが表示された時までです。リロードすると変数はリセットされます。
それでは少し困る事も出てくることがあります。
例えばユーザーに入力を求めるフォームで、入力内容を確認する仕組みを作る場合です。
入力を確認してミスがあった場合に、もとの入力画面に戻りますが、入力されたデータは変数に格納されていますので消滅してしまいます。それではユーザーはまた一から入力をしなければなりません。場合によっては折角のチャンスを失う可能性もあるわけです。ここはやっぱり元の入力値を保持しておきたいものです。

そんなときに使用するのがセッションです。
わかりやすい表現を使うならセッションは2つのページを跨がって情報を保持する器です。
もう少し突っ込んで説明すると、セッションはクッキーを使用してブラウザとの紐付けを行いデータを保持するものです。

セッションの使い方

  1. session_start()関数でセッションを開始
  2. スーパーグローバル変数の$_SESSION[]に値を格納する
  3. $_SESSION[]に格納した値が必要になるとsession_start()関数でセッションを開始すると値が受け取れる
  4. 処理終了後はsession_unset()でセッションを終了させる

session_start()は新しいセッションIDを割り当てたり、クッキーを作成してブラウザに送信して、すでに読み込んでいる変数を読み込みます。
登録されている変数を連想配列であるスーパーグローバル変数の$_SESSIONに読み込みます。連想配列のキーは変数名です。

session_start()はページの先頭に記述するようにします。
この関数はヘッダを追加します。追加されたヘッダが適切に送られるにはHTMLなどの出力の開始前に追加されなければなりません。

セッションの破棄

セッションは不要になったら速やかに削除します。
通常は次のものを使います。

session_destroy()

session_destroy()を使用するとセッションIDの名前のが付けられてたファイルごと(当然内容も含めて)消去されます。

session_unset

session_unsetを使用するとセッションIDの名前のが付けられてたファイルはそのまま残りますが、そのファイルに書き込まれた内容(値)が消されます。

特定のデータを削除するには次のようにします。

unset($_SESSION)はスーパーグローバル変数の$_SESSION自体を消去しますので、絶対に使用してはいけません。

詳細なセッションの仕組み

session_start()関数でセッションをスタートさせますが、この関数は何を行っているのか知る必要があります。
この関数は新しいセッションを開始する役目と、既存のセッションを再開する役目があります。
つまりセッションを利用する場合は必ず最初にこの関数を使ってセッションを開始しておく必要があります。

session_start()の1つ目の役割

この関数は新しいセッションを開始する役目があります。
新しいセッションを開始するとは一体どういうことでしょうか。
それは、「セッションID」生成することです。セッションIDは32文字の乱数が使われる場合が多いです。
さらに、セッションIDと共にグローバル変数の$_SESSIONに格納された値を保持するためのセッションファイルをWebサーバ上に生成します。

その後、PHPスクリプトの実行の完了とともに、$_SESSIONに格納された値を生成されたセッションファイルに書き込みます。

Webサーバーからブラウザにレスポンスを返す際、セッションIDがヘッダーに記載されます。

Webサーバーから送られてきたセッションIDをブラウザがcookieとして保存します。WebサーバーとブラウザのセッションIDのやり取りは、cookieを使用する方法とその他にPOST,GETを使用する方法などがありますが、通常はcookieを使用する場合が多いです。

ここまでが、session_start()の1つ目の役割の流れになります。

session_start()の2つ目の役割

次にこの関すには既存のセッションを再開する役目があります。

別ページに遷移する時session_start()関数を冒頭で使用すると、cookieの値がWebサーバーに通知されます。
同じドメインにアクセスしたとき、HTTPリクエストの拡張ヘッダーにCookieを付けて送信します。
セッションIDを受け取ると、session_start関数はセッション変数を復活させます。

セッションIDがクッキーによって通知された場合、session_start関数はセッションファイルから値を取り出します。
このときWebサーバーのディスク上にセッションファイルがあるかどうか確認します。
ファイルが存在した場合は、ファイルの中身を取り出して、$_SESSIONの値を復活させます。
もし、ファイルが無くて値が取り出せない時はfalseを返します。

session

セッションは使い方を覚えれば簡単に使用できて、ネットショッピングのサイト構築をはじめ、便利なWebアプリケーションを作成できます。
けれども、その反面セキュリティの問題が起こりやすいものです。
中途半端な知識のもとに作られたサイトは脆弱性を抱えることになります。十分な知識を持っていても問題は多発してますね。。。セキュリティの問題をしっかり学習しておきましょう。