PHP - WEB - 13. セッションの破棄

引き続きセッションの仕組みについて学習していきましょう。PHPの $_SESSION 変数に保存されたデータは、デフォルトでサーバ上にファイルとして保存されています。そのため $_SESSION 変数に不要なデータを保持してしまうとその分サーバ上のリソースを圧迫することになります。

$_SESSION 変数に保存するデータは必要最低限にとどめるようにします。

またPHPのセッションには有効期限(デフォルトで180分)があります。有効期限を超過した場合はセッションを利用できなくなります。このような有効期限の設定は php.ini ファイル上で変更することもできます。

他にもPHPプログラムの中からセッションを破棄する方法も用意されています。具体的にはPHPプログラム上で不要なセッションを破棄するには session_destroy 関数を使います。ここではセッションを破棄する方法について見ていくことにします。

PHPプログラムの開発(ログアウト処理)

ここではまず既存のログイン処理に加えて、新たにログアウト処理( logout.php )を作成してみましょう。

<?php
session_start();
session_destroy();
header("location: login.html");

ログアウト処理の中でセッションを破棄するように実装します。ここでは session_destroy 関数を使ってセッションを破棄した後、 header 関数を使ってログイン画面( login.html )へリダイレクトしています。

それからメニュー画面表示処理( menu.php )も修正します。

<?php
session_start();
if (!isset($_SESSION["id"])) {
  header("location: login.html");
  return;
}
$id = $_SESSION["id"];
$time = $_SESSION["time"];
?>
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>PHP Sample</title>
</head>
<body>
  <h3>Menu - Hello <?php echo $id ?>
  <h5>Login at <?php echo $time; ?></h5>
  <hr>
  <ul>
    <li><a href="logout.php">logout</a></li>
  </ul>
</body>
</html>

修正箇所は2点です。まず1つ目はセッション上に "id" キーが存在するか確認する処理です。

if (!isset($_SESSION["id"])) {
  header("location: login.html");
  return;
}

ここでは isset 関数を使って $_SESSION 変数に "id" キーが存在するか確認しています。通常、ログイン画面からアクセスしてきた場合はログイン処理( login.php )において $_SESSION 変数に "id" キーを代入しています。これはログイン画面を経由せずにWebブラウザのアドレスバーから次のようにURLを入力し、直接メニュー画面表示処理( menu.php )にアクセスしてきた場合の対処です。

https://〜.vfs.cloud9.ap-northeast-1.amazonaws.com/menu.php

ログインせずに直接アクセスされた場合はログイン画面( login.html )へリダイレクトするようにしています。

修正箇所の2点目は、ログアウト処理( logout.php )へのリンクの追加です。

  <ul>
    <li><a href="logout.php">logout</a></li>
  </ul>

ここでは a タグを追記してログアウト処理へのリンクを表示しています。

それでは実際にプログラムを実行してみましょう。まずはビルトインWebサーバを起動します。

$ php -S localhost:8080

続いてWebブラウザをシークレットモードで開きましょう。

既にシークレットモードでウィンドウを開いている場合は、一度閉じてから、再度開き直すようにしましょう。

Webブラウザからログイン画面( login.html ) にアクセスします。アドレスバーに以下のURLを入力します。

https://〜.vfs.cloud9.ap-northeast-1.amazonaws.com/login.html

ログイン画面が表示されたら、ここではIDに "Andy" 、パスワードに "secret" と入力してログインボタンをクリックしてみましょう。そうすると次のようなメニュー画面表示処理( menu.php )が表示されます。

ここでログアウト用のリンクが追加されているので、クリックしてログアウトしてみましょう。そうするとログアウト処理( logout.php )でセッションが破棄され、再びログイン画面にリダイレクトします。

続いてWebブラウザのアドレスバーから直接メニュー画面表示処理( menu.php )にアクセスしてみましょう。

https://〜.vfs.cloud9.ap-northeast-1.amazonaws.com/menu.php

そうするとセッションが破棄されているので、メニュー画面の描画は行わずに、再びログイン画面にリダイレクトするようになります。

このようにセッションが破棄されているため、メニュー画面を表示するためには再度ログイン処理が必要となります。

参考:セッション変数とCookieの削除について

PHPマニュアルの session_destory 関数のページにはCookie上のセッションIDの削除やセッション変数( $_SESSION )そのものを解除する方法も紹介されています。

https://www.php.net/manual/ja/function.session-destroy.php#refsect1-function.session-destroy-examples

session_destroy 関数を呼び出すだけでは $_SESSION 変数として利用していたデータがメモリ上に残ってしまったり、Webブラウザ上のCookieにあるセッションIDは残り続けてしまいます。このような状態はあまり好ましいものではありません。上記のマニュアルページを参考にすれば $_SESSION = array(); とすることで変数の内容を解除したり、 setcookie 関数でセッションIDを無効にしたりすることができます。

まとめ

  • セッション( $_SESSION )に保存したデータはサーバ上に保存される
  • セッションはユーザごとに作成されるので、不要なセッションは破棄する必要がある
  • セッションに保存したデータには有効期限がある(デフォルト180分)