セッション

セッションとは何か

ショッピングサイトで買い物かごに品物を入れて、いざ会計となれば必ず別の会計用のページに移動しますよね。ではページを移動したとき、Webサーバ側では「同一ユーザーがアクセスしている」ことを、どう判断しているのでしょうか。買い物の最中に、もし赤の他人があなたの会計のページに割り込んできたら....、これはもう大変なことにになっていまいます。

「同一ユーザーがアクセスしている」ことをPHPで判断するとき、多くの場合セッションを利用しています。セッションを開始すると、Webサーバーはクライアントに対して「セッションID」という特別の値を発行します。

クライアントはこの「セッションID」をパソコンに保存し、そして別のWebページに移動してもこの「セッションID」を持ち歩きます。

Webサーバーは、同じ「セッションID」を持っているクライアントを「同一ユーザー」と判断するのです。

 

f:id:mkyosuke:20191206102041p:plain

やっている処理は複雑ですが、PHPを利用すればsession_start関数とスーパーグローバル変数$_SESSIONにより、簡単に実装できます。

セッションのスタート

セッションを利用する具体的な手順を紹介します。まず、セッションを開始するとsession_start関数を実行します。

関数  session_start()

機能  新規のセッションを開始、または継続する

返り値 セッションを正常に開始するとTRUE、正常に開始しないとFALSEを返す

session_start関数が実行されると、「PHPSESSID」というCookieが自動的に作成されます。この「PHPSESSID」をセッション名、そしてその値をセッションIDといいます。セッション名はphp.iniの「session.name」で設定されており、不変です。(もちろんphp.iniの以下の行を書き換えれば別のセッション名を使うことはできます)。

session.name = PHPSESSID

しかしセッションIDは、session_start関数が実行されると一意な値が設定されます。試しにセッション名とセッションIDを確認してみましょう。

これらの情報はsession_name関数,session_id関数を引数なしで実行すると取得することができます。

session_test.php

<?php
session_start();
print "セッションを開始しました<br>";
print "セッション名は".session_name();
print"<br>";
print"セッションIDは".session_id();
?>

実行結果

f:id:mkyosuke:20191206104435p:plain

 セッション名は前述の通り「PHPSESSID」、セッションIDは「u71jnmmbn1irk9vvtspntocj4v」のように複雑な英数字になります。しかし、これらは私たちユーザーが直接扱うものではないので安心してください。

ちなみに一度ブラウザを閉じてから、もう一度先ほどの「session_test.php」を実行すると、新たなセッションIDが割り振られるのが分かります。

■サーバー側に保存されるセッションID

先ほどセッションIDがCookieとして保存されるという話をしましたが、同じセッションIDはサーバー側でも保存されます。XAMPを使用してPHPをインストールした場合、セッションIDの保存場所は「c:¥xampp¥tmp」になります。この場所の内容を表示すると、「sess_u71jnmmbn1irk9vvtspntocj4v」のセッションIDが名前についているファイルがあります。

c:¥xampp¥tmpに保存されたセッションID

f:id:mkyosuke:20191206110109p:plain

このセッションIDのファイル名は「sess_セッションID」の形式になっています。このようにPHPでは、同じセッションIDをサーバー側とクライアント側の両方に保存することにより、セッションの同一性を確保します。

なお、session_startは、基本的にブラウザに何かを書き出す前に実行する必要があります。これはCookieのときと同じです。session_startを実行する前に、何かをページに書き出した場合、環境によっては警告が表示されることがあります。(php.iniの「output_bufferig=off」の場合

offの場合session_startやsetcookieの前に書き出すとエラーになってしまいます。