PHP アドバンス

PHP Sessions

1. PHPセッションとは何か?

セッション変数は、単一のユーザーに関する情報を保持し、一つのアプリケーション内のすべてのページで利用可能にするための仕組みです。

通常のアプリケーションを利用する際、アプリを開き、変更を加え、そして閉じます。これが「セッション」に近い概念です。コンピュータはあなたが誰であるかを知っており、いつアプリを開始し、いつ終了したかを認識しています。しかし、インターネット上には一つの大きな課題があります。HTTPアドレスは「状態(ステート)」を保持しないため、Webサーバーはユーザーが誰であるか、あるいは何をしているかを認識できません。

セッション変数は、複数のページをまたいで使用するユーザー情報(ログイン情報やショッピングカートの内容など)を保存することで、この問題を解決します。
デフォルトでは、セッション変数はユーザーがブラウザを閉じるまで保持されます。

       Tips: 恒久的なデータストレージが必要な場合は、データベースへの保存を検討してください。

2. PHPセッションの主要な関数

セッション操作において最も重要な関数は以下の通りです。

  • session_start() - 新しいセッションを開始、または既存のセッションを再開します。
  • $_SESSION - セッション変数の保存およびアクセスに使用するスーパーグローバル変数です。
  • unset() - 特定のセッション変数を削除します(例:unset($_SESSION["favcolor"]))。
  • session_destroy() - 現在のセッションに関連付けられたすべてのデータを破棄します。
  • session_unset() - すべてのセッション変数を解放します。

3. PHPセッションを開始する

セッションは session_start() 関数で開始します。

       注意:session_start() 関数は、HTML出力や空白文字が送信される前、つまりPHPスクリプトの最初に呼び出す必要があります。

PHPのスーパーグローバル変数 $_SESSION は、現在のスクリプトで利用可能なセッション変数の保存とアクセスの両方に使用されます。

それでは、"test.php" というページを作成してみましょう。このページで新しいセッションを開始し、いくつかのセッション変数を設定します。

3.1 実装例(test.php)

<?php
// セッションを開始
session_start();
?>

<!DOCTYPE html>
<html>
<body>

<?php
// セッション変数をセット
$_SESSION["favcolor"] = "green";
$_SESSION["favanimal"] = "cat";
echo "セッション変数がセットされました。";
?>

</body>
</html>

4. セッション変数の値を取得する

次に、別のページ "test2.php" を作成します。このページから、最初のページ("test.php")で設定したセッション情報にアクセスします。

4.1 実装例(test2.php)

<?php
// セッションを再開
session_start();
?>

<!DOCTYPE html>
<html>
<body>

<?php
// 前のページでセットされたセッション変数を出力
if(isset($_SESSION["favcolor"])) {
  echo "好きな色は " . $_SESSION["favcolor"] . ".<br>";
  echo "好きな動物は " . $_SESSION["favanimal"] . ".";
} else {
  echo "セッションデータが見つかりません。";
}
?>

</body>
</html>

5. 動作の仕組み:どのように個人を識別しているのか?

ユーザーが session_start() 関数を呼び出すページにアクセスすると、PHPはユーザーのブラウザに既存の「セッションID」があるかを確認します。セッションIDが見つからない場合、PHPはユニークでランダムなIDを生成します。

このID(通常 PHPSESSID という名前のクッキーに保存されます)は、クライアント側に保存される唯一の情報です。実際のセッションデータはサーバー上にセキュアに保存されます(通常は一時的なファイルとして保持されます)。

次のページロード時、サーバーはクッキーからセッションIDを取得し、そのIDを使用してサーバー上のセッションデータをPHPのスーパーグローバル変数 $_SESSION にロードします。これにより、すべてのスコープでセッションデータが利用可能になります。

ユーザーセッションのすべての変数を一覧表示するもう一つの方法は、print_r($_SESSION) を使用することです。

5.1 実装例(デバッグ用)

<?php
// セッションを再開
session_start();
?>

<!DOCTYPE html>
<html>
<body>

<?php
// すべてのセッション変数を表示
print_r($_SESSION);
?>

</body>
</html>

6. PHPセッション変数を変更する

セッション変数を変更するには、単純に値を上書きします。

6.1 実装例

<?php
// セッションを再開
session_start();
?>
<!DOCTYPE html>
<html>
<body>

<?php
// セッション変数を変更するには、単に上書きする
$_SESSION["favcolor"] = "yellow";
print_r($_SESSION);
?>

</body>
</html>

7. PHPセッションを破棄する

次に、"logout.php" というページを作成します。ここでは、すべてのセッション変数をクリアし、セッション自体を破棄(session_unset()session_destroy() を使用)します。

7.1 実装例(logout.php)

<?php
// セッションを再開
session_start();
?>

<!DOCTYPE html>
<html>
<body>

<?php
// すべてのセッション変数を解除
session_unset();

// セッションを破棄
session_destroy();

echo "ログアウトしました。";
?>

</body>
</html>

8. PHPセッション vs クッキー

セッションとクッキーの主な違いは以下の通りです。

特徴セッション (Session)クッキー (Cookies)
データ保存先サーバー側に保存されるブラウザ(クライアント)側に保存される
有効期限ブラウザを閉じるか、一定時間の無操作で失効する長い有効期限を設定できる
セキュリティデータがブラウザに保存されないため、よりセキュアデータがブラウザに保存されるため、セキュアではない
効率性ブラウザとサーバー間での頻繁なデータ転送を必要としないため効率的リクエストのたびにデータが送信されるため、効率が落ちる