セッションとは?
ユーザーページなどでどのように個人を特定しているのか?というとPHPの場合はセッションという機能を使って一時的(あるいは一定期間)個人のIDみたいなものを発行して、ある個人がページ間を行き来できるようにしています。というのは、ある人物だけが特定の情報(例えば自分が登録した個人情報)を確認したいという場合は、サイトにアクセスし、ログインし、その情報ページを閲 覧することになります。もっとセキュリティーの厳しいサイトではネットバンキングのような直接お金を扱うものもありますが、ここでも基本的にはセッション 機能を使って個人を特定しています。
セッションはユーザーがログインし認証された後に中の複数に渡るページを行き来できるようにした便 利な機能です。しかもログインした際にはログアウトまでの一時的な期間のみ個人を特定できる方がセキュリティー上好ましいのです。なぜならその都度IDを 変化させるので、恒久的なIDを発行するよりも都合がよいわけです。
- 何らかの方法でログイン(認証)する。大抵の場合DBなどを利用して不可逆性の暗号化アルゴリズムを使って認証します。現在はSHA1やMD5などを利用します。
- 認証後、セッションを開始します。ここでは、(1)セッション名、(2)セッションの持続時間などを同時に設定します。
- サーバー上にセッションIDを保持してログインした本人であるかどうかを確認しながら各ページを表示させます。セキュリティーが厳しいサイトでは数分でセッションが切れる仕組みになっている筈なので、途中で再ログインしなくてはならない場合もあります。
- ログアウトした際には、そのセッションを初期化して消滅させます。
セッションをスタートさせる
セッションの開始は、session_start();関数を使います。しかし、開始の前に幾つかの設定をします。任意のセッション名を使用したい場合 は、session_start()の前に、session_name('<任意の名前>')を設定します。認証後だとしたら、 session_name($user_name);などのようにユーザー名にしておくことが多いかもしれません。session_name('<任意のユーザー名>');
session_start();
セッションを開始するとサーバー側では、デフォルトで/tmpや/var/lib/php/sessionなどのディレクトリにセッション名と セッションIDを含んだファイルが自動的に生成され保存されます。この時IDは、サーバーの環境にもよりますがたいていの場合32文字の予想されにくいラ ンダムな文字列が生成されます。
つまりは、session_name()を指定して、このセッション名に対してIDが自動的に割り振られるという仕組みになっています。
セッション名とセッションIDを取得する
セッションは複数ページを行き来するのに特定の本人かどうかを確認するための手段です。ですからセッションが開始されるとセッション名とセッションIDは一定期間サーバー側に保存されます。$session_name = session_name(); //セッション名を取得
$session_id = session_id(); //セッションIDを取得
echo $session_name.'のIDは、'.$session_id.'です。';
このセッション名とセッションIDはセットで保存されているので、一定期間いつでも呼び出すことができます。この一定期間というのが曖昧なのですが、サー バーの設定状況やクライアントのクッキー有効期限の設定によって異なります。後から解説しますが、かなり細かい指定を秒単位で行うこともできます。たいて いの場合デフォルトでは24分に一回セッションを活性化させる(スタートさせる)ことでセッションは永久に持続されます。逆に24分以上放置しておくと セッションは閉じられます。
セッション変数を設定する
ショッピングサイトなどでは「買いものカゴ」なるものをよく見かけます。買いものカゴに入れた商品はショッピングしている間は持続されます。レジに持っていった時には、カゴに入れたものすべてが揃っています。この機能も大抵はセッション機能を利用しています。セッション変数は$_GETや$_POSTと同じようなスーパーグローバル変数に保存されます。$_SESSIONという変数がそれです。この変数には任 意の値を代入することができます。ですから、買いものカゴだけとはいわず、利用者のページ利用を追跡することもできます。
先の例の続きですと、
$_SESSION['<任意のユーザー名>'] = $time(); //ユーザーのアクセス時間をとる
$_SESSION['kaimono'] = array ('<商品番号1>', '<商品番号2>', '<商品番号3>', ...); //配列もOK!
各違ったページでこの変数を呼び出し値を変化させてゆくことができます。
セッションを終了させる
ログアウト時などにセッションを強制的に終了させる方法は、session_end();ではありません。session_destroy(); です。これでセッションは破棄されます。しかしセッションの変数は残ったままなので、セッション変数も初期化しておくのがよいです。$_SESSION = array();
session_destroy();
注意事項
セッションを開始する際に注意すべきことは、セッションに関するすべての動作はPHPのヘッダーが送信される以前に実行しなくてはなりません。つまり、printやその他の出力関数の後にセッションを開始すると、Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at /home/*/public_html/test/php/session/session.php:72) in /home/*/public_html/test/php/session/session.php on line 84のような警告が発せられます。できるだけスクリプトの最初の方で実行してください。



