記事内にはプロモーションが含まれています

PHPでセッションを削除する方法

PHPでセッションを削除する方法 プログラミングの疑問解決

PHPでログイン機能やショッピングカートなどを実装する際に不可欠なのが「セッション管理」です。

ユーザーの状態をサーバー側で一時的に保持するこの便利な仕組みは、Webアプリケーション開発の基本と言えるでしょう。

セッションに値を保存する方法は直感的ですが、それを「削除する」段階になると、少し注意が必要になります。

「ログアウトボタンを押したのに、なぜかログイン状態が続いてしまう」
「一部のデータだけを消したい場合はどうすればいいの?」

こういった疑問を持ったことがある方もいるでしょう。

実は、PHPのセッション削除には複数の方法があり、それぞれに役割が異なります。
特に、ログアウト処理を安全に実装するためには、正しい手順でセッションを完全に破棄することが非常に重要です。

この記事では、セッションを削除するための各関数の違いから、セキュリティを考慮した正しいログアウト処理の実装方法まで、具体的なサンプルコードを交えて徹底的に解説します。

【著者プロフィール&本記事の信頼性】
プロフィール
  • 著者は元エンジニア
  • 大手プログラミングスクールのWebディレクター兼 ライターを経験
  • 自らも地元密着型のプログラミングスクールを運営
プロフィール詳細はコチラ
当ブログ著者
当ブログ著者
忖度は一切なし!
本気で未経験からエンジニア転職を目指すなら、
日本最大級の比較サイト「マイベスト」で【4年連続人気NO.1】となった
RUNTEQ(ランテック)一択!
【RUNTEQの特徴】
✅受講生からの評判が驚くほど良い
✅学習はハードだが未経験とは思えないほど高いスキルが身に付く
挫折させない万全なサポート体制が用意されている
✅採用面接で担当者に刺さるレベルの高い「ポートフォリオ」を作成できる
✅給付金を使えば実質約13万円という格安料金で受講できる

\ もちろん勧誘行為は一切なし! 相談だけでもOK! /

【目的別】セッションを削除する3つの方法

PHPでセッションデータを削除する方法は、何をしたいかによって大きく3つに分けられます。

目的 使用する方法 特徴
特定のデータだけを削除したい
(例:カート内の1商品、エラーメッセージなど)
unset($_SESSION['キー名']) 指定したキーのセッション変数のみを削除する。他のセッションデータは保持される。
全てのデータを削除したい
(セッション自体は維持)
$_SESSION = [] $_SESSION配列を空にする。データは消えるが、セッションIDは有効なまま。
セッションを完全に終了させたい
(例:ログアウト処理)
session_destroy() サーバー上に保存されているセッションファイルを削除する。完全なログアウトには追加の処理が必要。

これらの方法は、どれか一つが優れているというわけではなく、目的に応じて使い分けることが重要です。

それでは、それぞれの詳細な使い方を見ていきましょう。

特定セッション変数のみ削除する unset()

$_SESSIONに保存されているデータの中から、特定のキーを持つ値だけを削除したい場合には、unset()関数を使用します。

unset()は、PHPの変数を破棄するための汎用的な関数です。

これは、例えばショッピングカートから特定のアイテムを削除したり、一度表示したら不要になるフラッシュメッセージ(エラー通知など)を消去したりする際に便利です。

サンプルコード

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

// セッションに変数を設定
$_SESSION['username'] = 'Taro Yamada';
$_SESSION['cart_item_id'] = 123;
$_SESSION['message'] = '商品を追加しました。';

echo '削除前のセッション: ';
print_r($_SESSION);
echo '<br>';

// 'message'キーを持つセッション変数のみを削除
unset($_SESSION['message']);

echo '削除後のセッション: ';
print_r($_SESSION);
?>

実行結果

削除前のセッション: Array ( [username] => Taro Yamada [cart_item_id] => 123 [message] => 商品を追加しました。 )
削除後のセッション: Array ( [username] => Taro Yamada [cart_item_id] => 123 )

$_SESSION['message']だけが綺麗に削除され、他のセッションデータには影響がないことが確認できます。

全てのセッション変数を削除する $_SESSION = []

セッションに保存されている全てのデータを一括でクリアしたいが、セッション自体は継続させたい、という場合(例えば、フォーム入力をリセットする機能など)には、$_SESSIONスーパーグローバル変数を空の配列で上書きする方法が最もシンプルで確実です。

サンプルコード

<?php
session_start();

$_SESSION['username'] = 'Jiro Suzuki';
$_SESSION['role'] = 'editor';

echo 'クリア前のセッションID: ' . session_id() . '<br>';
echo 'クリア前のセッション変数: ';
print_r($_SESSION);
echo '<br>';

// 全てのセッション変数を空にする
$_SESSION = [];

echo 'クリア後のセッションID: ' . session_id() . '<br>';
echo 'クリア後のセッション変数: ';
print_r($_SESSION);
?>

実行結果

クリア前のセッションID: (一意のIDが表示される)
クリア前のセッション変数: Array ( [username] => Jiro Suzuki [role] => editor )
クリア後のセッションID: (同じIDが表示される)
クリア後のセッション変数: Array ( )

$_SESSIONの中身は空になりましたが、セッションIDは変わっていません。

これは、データは消えたものの、ユーザーとサーバーのセッションの繋がり自体は維持されていることを意味します。

セッション自体を破棄する session_destroy()

session_destroy()は、サーバー上に保存されているセッションデータファイルそのものを削除する、最も強力な関数です。

主にログアウト処理で使用され、ユーザーのセッションを完全に終了させることが目的となります。

サンプルコード

<?php
session_start();

$_SESSION['login_user_id'] = 1;
echo '破棄前のセッション変数: ';
print_r($_SESSION);
echo '<br>';

// セッションファイルをサーバーから削除
$result = session_destroy();

if ($result) {
    echo 'セッションを破棄しました。<br>';
}

// 注意:この時点ではまだ$_SESSION変数には値が残っている
echo '破棄後のセッション変数(現在のスクリプト内): ';
print_r($_SESSION);
?>

実行結果

破棄前のセッション変数: Array ( [login_user_id] => 1 )
セッションを破棄しました。
破棄後のセッション変数(現在のスクリプト内): Array ( [login_user_id] => 1 )

この結果から、次のセクションで解説する非常に重要な「罠」が見えてきます。

【最重要】session_destroy()の罠と正しい使い方

session_destroy()を実行したにもかかわらず、なぜ最後のprint_rでは$_SESSIONの中身が表示されてしまうのでしょうか。

これには2つの理由があります。

  1. $_SESSION変数は即座には消えない: session_destroy()はサーバー上のファイル(例: /tmp/sess_xxxxxxxx)を削除する命令です。しかし、そのスクリプトが実行されている間は、PHPがメモリ上に保持している$_SESSION変数の内容は消えません。
  2. ブラウザのクッキーは消えない: セッションは、ブラウザに保存されたセッションID(クッキー)と、サーバー上のセッションファイルが紐付いて成立しています。session_destroy()はサーバー側のファイルを消すだけで、ブラウザのクッキーには何の影響も与えません。

このため、session_destroy()だけを実行した状態でページをリロードすると、ブラウザは古いセッションIDのクッキーをサーバーに送り続けます。

サーバー側は対応するセッションファイルがないため、新しい空のセッションを開始してしまい、意図せずログイン状態が続くような挙動に見えることがあるのです。

安全なログアウト処理の正しい実装方法

これらの問題をすべて解決し、ユーザーを安全にログアウトさせるためには、以下の手順を順番に実行することがベストプラクティスとされています。

  1. session_start(): まずはセッションを開始して、既存のセッションにアクセスできるようにします。
  2. $_SESSION = []: $_SESSION配列を空にして、現在のスクリプト内でセッションデータにアクセスできなくします。
  3. セッションクッキーを削除: setcookie()を使って、ブラウザに保存されているセッションIDのクッキーを、過去の有効期限で上書きして無効化します。
  4. session_destroy(): サーバー上のセッションファイルを完全に削除します。

この4つのステップを実装した、完全なログアウト処理のコードは以下のようになります。

ログアウト処理の完全なコード (logout.php)

<?php
// 1. セッションを開始する
session_start();

// 2. セッション変数をすべて空にする
$_SESSION = [];

// 3. セッションクッキーを削除する
// クッキー名(デフォルトでは'PHPSESSID')を取得する
$cookie_name = session_name(); 
// セッションパラメータを取得する
$cookie_params = session_get_cookie_params(); 

// クッキーを過去の時間で上書きして、有効期限切れにする
setcookie(
    $cookie_name,
    '',
    time() - 3600,
    $cookie_params['path'],
    $cookie_params['domain'],
    $cookie_params['secure'],
    $cookie_params['httponly']
);

// 4. サーバー上のセッションファイルを削除する
session_destroy();

// ログアウト後にリダイレクト
header('Location: login.php');
exit;
?>

このコードを実行することで、セッションに関連するデータがクライアント(ブラウザ)とサーバーの両方から綺麗に削除され、安全なログアウトが実現できます。

まとめ

今回は、PHPでセッションを削除するための様々な方法と、安全なログアウト処理の実装について解説しました。

なお、PHPを体系的に学んだり、PHPのスキルを高めたりするためには、プログラミングスクールを利用するのも有効です。

細かな疑問がすぐに解決するだけでなく、現役エンジニアが「質の高いポートフォリオ」を作成するための手助けをしてくれたり、エンジニア就職・転職のコツを教えてくれたりするなど、様々なメリットがありますので、独学に疲れた方は検討してみてはいかがでしょうか。

おすすめエージェント
当ブログ著者
当ブログ著者
\ 当ブログ著者厳選! /
\ 登録・利用はすべて完全無料! /
未経験からのエンジニア転職を成功させたい
ユニゾンキャリア
実務未経験エンジニアでも希望の転職先を見つけやすい!!

スキルを活かして副業で稼ぎたい
MidWorks(ミッドワークス)
週1~3日からできる副業案件多数!!

フリーランスとして高単価な案件を獲得したい
レバテックフリーランス
フリーランス案件の単価の高さは圧倒的!!
当ブログ著者
当ブログ著者
忖度は一切なし!
本気で未経験からエンジニア転職を目指すなら、
日本最大級の比較サイト「マイベスト」で【4年連続人気NO.1】となった
RUNTEQ(ランテック)一択!
【RUNTEQの特徴】
✅受講生からの評判が驚くほど良い
✅学習はハードだが未経験とは思えないほど高いスキルが身に付く
挫折させない万全なサポート体制が用意されている
✅採用面接で担当者に刺さるレベルの高い「ポートフォリオ」を作成できる
✅給付金を使えば実質約13万円という格安料金で受講できる

\ もちろん勧誘行為は一切なし! 相談だけでもOK! /