今からスタート! PHP

第7回セッションの開始と終了

セッションとは?

セッション(session)と聞いて、あなたは何を思い浮かべるでしょうか。おそらく、ディスカッションを行うトークセッションや、ミュージシャンのジャムセッションなどが連想されるのではないかと思います。英和辞書を引くと、会議の開会・裁判の開廷といった意味があることもわかります。

これらに対して、すべて同じsessionという単語が使われているということは、いずれにも共通していることがあるはずです。それは何でしょうか。

答えは、「同じ場に複数のメンバーが同時に会している」ということです。トークセッションでは、意見を述べる人と聞く人とがいなくてはなりません。ジャムセッションでは、同じステージ上で同時に演奏していなければ、ミュージシャン同士のやりとりを楽しめません。開会・開廷も同じ場に会していなければ、段取りや手続きを進めることができません。

sessionという単語は、もともと「座る」という意味を持つ単語から生まれたもので、⁠一同で席に着く」というところから、上記のものへとその意味合いも派生していったのです。

PHPプログラムにおけるセッション

そこで、PHPプログラムにおけるセッションとは何かということですが、これは「WebサーバとWebブラウザとをつながっている状態」を意味します。⁠つながっている」とは、電話と同じで、相手と会話できていることをいいます。WebブラウザからのアクセスによりWebサーバからコンテンツが送信されることを、この会話に例えているわけです。

電話での会話は、地理的に相手との距離が離れていても、実質的に同じ場を共有しているといえますが、WebブラウザとWebサーバによる通信も同じ場を共有していると考えてよいでしょう。

PHPでセッションが繋がっているかどうかを確認する方法として、前回紹介したクッキーが主に用いられます図1⁠。Webブラウザがクッキーをサポートしていなければ、URLにセッションIDが含まれることになります。セキュリティの面からは、クッキーによる方法が良いとされています※1。本稿でもこちらを説明していきます。

図1 クッキーに保存されたセッションIDの例
クッキーに保存されたセッションIDの例
※1 前回紹介したとおり、クッキーにもセキュリティの問題はあるため、これで完全に安心とはいえません。

セッションの開始

つながっている状態にすることを、セッションを開始するといいます。PHPプログラムでは、session_start()を実行します。セッションを継続しておく場合にも、これを実行しなくてはなりません。

セッションはクッキーを利用して実現していますので、必ずリスト1のようにHTMLよりも先に記述してください。

リスト1 session_start()はHTMLタグよりも前に記述する
<?php
  // ..........
  session_start();
  // ..........
?>
<html>
  <!-- ..... コンテンツ ..... -->
</html>

リスト2に、セッションを開始するときに設定されるセッションIDを画面に表示する例を示します※2。実行結果は図2です。セッションIDはsession_id()という関数で知ることができます。

※2 セキュリティの面からは、セッションIDを画面に表示させるのは好ましいことではありませんが、説明のためにこの例を示しています。
リスト2  セッションIDを表示する
<?php
  session_start();
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
                      "http://www.w3.org/TR/html4/strict.dtd">
<html>
  <head>
    <title>セッションの開始と終了</title>
  </head>
  <body>
    <h4>セッションの開始と終了</h4>
<?php
      echo 'セッションは開始されました<br>ID = ' . session_id();
?>
  </body>
</html>
図2 リスト1の実行結果
図2 リスト1の実行結果

セッションの切り替え

session_regenerate_id()関数によってセッションIDを変更すると、新しいセッションに切り替えられます。リスト3は、リスト2にIDを変更するためのボタンを追加したものです。実行結果を図3に示します。

リスト3 セッションIDの変更
<?php
  session_start();
  if ( isset( $_POST[ 'regenerate' ] ) )  {
    session_regenerate_id();
  }
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
                      "http://www.w3.org/TR/html4/strict.dtd">
<html>
  <head>
    <title>セッションの開始と終了</title>
  </head>
  <body>
    <h4>セッションの開始と終了</h4>
<?php
      echo 'セッションは開始されました<br>ID = ' . session_id();
?>
    <form method="post" action="<?php echo $_SERVER[ 'PHP_SELF' ]; ?>"><div>
      <input type="submit" name="regenerate" value="IDを変更">
    </div></form>
  </body>
</html>
図3 リスト3の実行結果
図3 リスト3の実行結果

セッションの終了

つながっている状態をやめることを、セッションを終了するといいます。これには、設定によっていくつかの方法に分かれています。

Webブラウザを閉じたとき

デフォルトの設定でセッションを開始したときは、Webブラウザを閉じるまで同じセッション(ID)が有効です。ちょっと面倒ですが、リスト2を実行した後にWebブラウザを閉じ、もう一度開きなおして再度リスト2を実行すると、前回とは異なるIDが表示されるはずです。

設定した有効期限を過ぎたとき

セッションを開始する前に、あらかじめ有効期限を設定しておくと、それを過ぎてからアクセスがあっても、自動的にセッションが終了したと判断し、新たなセッションIDが設定されます。

セッションに有効期限を設定するのはsession_set_cookie_params()関数です。これを実行してからの秒数単位で指定しますので、1時間有効にするなら60×60(=3600)秒間となります。この関数はsession_start()よりも前に実行しておかなくてはなりません。

リスト4 セッション有効期限の設定
session_set_cookie_params( 60 * 60 );  // 1時間有効なセッション
session_start();                       // セッション開始

強制的に終了するとき

PHPプログラムでセッションIDを削除すると、強制的にセッションが終了されます。終了する前に、必ずそれまで使用していたデータを削除しておくようにしましょう。

リスト5 セッション強制終了
session_destroy();                     // 関連データの廃棄
setCookie( 'PHPSESSID' );              // 通常はこれで削除できる
setCookie( 'PHPSESSID', '', 0, '/' );  // 上記でクッキーを削除できないとき
'PHPSESSID'は設定により異なる場合がある

変数の利用

セッションでは、$_SESSION[名前]という変数を利用することができます。この変数は、同じ名前でもセッションごとに値が異なります。ですから、ユーザのアクセスに応じて処理を変えることもできます。変数を削除するときはunset( $_SESSION[名前] )とします。なお、$_SESSIONに関係する変数などの情報はクッキーではないため、特にプログラミングしない限りWebブラウザに送信されることはありません。これらの情報はサーバ内に保存されます。

リスト6「増やす」⁠減らす」をクリックすると、カウンタの値が増減するPHPプログラムです。図4のように複数のWebブラウザを開いてみると、カウンタの値をそれぞれ独立して増減させることができます。

リスト6 カウンタの値をボタンで増減させる
<?php
  session_start();
  if ( empty( $_SESSION[ 'count' ] ) )  $_SESSION[ 'count' ] = 0;
  if ( isset( $_POST[ 'inc' ] ) )  $_SESSION[ 'count' ]++;    // 増やす
  if ( isset( $_POST[ 'dec' ] ) )  $_SESSION[ 'count' ]--;    // 減らす
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
                      "http://www.w3.org/TR/html4/strict.dtd">
<html>
  <head>
    <title>セッションの開始と終了</title>
  </head>
  <body>
    <h4>セッションの開始と終了</h4>
<?php
    echo 'カウンタ : ' . $_SESSION[ 'count' ];    // カウンタの値
?>
    <form method="post" action="<?php echo $_SERVER[ 'PHP_SELF' ]; ?>"><div>
      <input type="submit" name="inc" value="増やす">
      <input type="submit" name="dec" value="減らす">
    </div></form>
  </body>
</html>
図4 リスト6の実行結果(ブラウザごとに値が異なっている)
図4 リスト6の実行結果(ブラウザごとに値が異なっている)

上記の3つのリストを実行する前に、まずキャッシュのデータやクッキーをいったん削除しましょう。それからWebブラウザを再起動しないと、修正の結果がうまく反映されないことがあります。こうしたことにも注意して、PHPプログラムの開発を進めていってください。

おすすめ記事

記事・ニュース一覧