【PHP8.x】session_unset関数の使い方

作成日: 更新日:

session_unset関数は、現在のセッションに関連付けられた全てのセッション変数の登録を解除する関数です。具体的には、グローバル変数 $_SESSION に格納されている全ての値を削除します。この関数を実行しても、セッション自体は破棄されず、セッションIDも変更されません。セッションを完全に破棄するには、session_destroy 関数を使用する必要があります。

session_unset 関数は、セッションデータを個別に削除する代わりに、セッション全体をリセットしたい場合に便利です。例えば、ユーザーがログアウトした際に、そのユーザーのセッションに関連付けられた全ての情報を削除するために使用できます。

この関数は引数を必要としません。関数を呼び出すと、現在のセッションの $_SESSION 配列の内容が空になります。ただし、この変更はスクリプトの実行中にのみ有効であり、実際にセッションデータが削除されるのは、スクリプトの実行が終了し、セッションデータが保存される時点です。

session_unset 関数を使用する前に、session_start 関数を呼び出してセッションを開始する必要があります。セッションが開始されていない状態で session_unset を呼び出すと、期待どおりに動作しない可能性があります。また、セッション変数を個別に削除する場合は、unset($_SESSION['変数名']) のように、unset関数を個別のセッション変数に対して使用します。

基本的な使い方

構文(syntax)

session_unset(): void

引数(parameters)

引数なし

引数はありません

戻り値(return)

true

セッション変数をすべて解除した場合、true を返します。

サンプルコード

PHP session_unset でセッション変数を削除する

<?php

declare(strict_types=1);

/**
 * session_unset() 関数の使用例を示します。
 * 
 * この関数は、現在登録されているすべてのセッション変数を解放(未設定に)します。
 * $_SESSION スーパーグローバル配列が空の配列になります。
 *
 * 実行手順:
 * 1. このファイルをWebサーバーのドキュメントルートに配置します。
 * 2. Webブラウザでこのファイルにアクセスします。
 * 3. 実行前と実行後で $_SESSION の内容が変化することを確認できます。
 */
function demonstrateSessionUnset(): void
{
    // セッションを開始します。セッション関連の関数を使用する前に必ず呼び出す必要があります。
    if (session_status() === PHP_SESSION_NONE) {
        session_start();
    }

    // --- 1. セッションに変数を設定する ---
    $_SESSION['username'] = 'Taro Yamada';
    $_SESSION['user_id'] = 12345;
    $_SESSION['last_login'] = date('Y-m-d H:i:s');

    echo '<h1>session_unset() 実行前</h1>';
    echo '<p>$_SESSION の内容:</p>';
    echo '<pre>';
    print_r($_SESSION);
    echo '</pre>';
    echo '<hr>';

    // --- 2. すべてのセッション変数を削除する ---
    // この関数を呼び出すと、$_SESSION 配列の中身がすべてクリアされます。
    // セッションID自体は破棄されません。
    session_unset();

    echo '<h1>session_unset() 実行後</h1>';
    echo '<p>$_SESSION の内容 (空になっていることを確認):</p>';
    echo '<pre>';
    print_r($_SESSION);
    echo '</pre>';

    // --- 3. 参考: セッションを完全に終了する ---
    // ログインセッションを完全に破棄する場合は、セッションIDも削除する
    // session_destroy() も併せて呼び出すのが一般的です。
    // session_destroy();
}

demonstrateSessionUnset();

PHPの session_unset() 関数は、現在実行中のセッションに保存されている全ての変数を削除するための関数です。この関数を呼び出すと、スーパーグローバル変数 $_SESSION に格納されている全てのキーと値のペアが解放され、$_SESSION 配列は空になります。この関数は引数を取らず、戻り値として常に true を返します。

サンプルコードでは、まず session_start() でセッションを開始し、$_SESSION 配列にユーザー名やIDなどのデータを意図的に設定します。session_unset() を実行する前の $_SESSION の内容を表示した後、この関数を呼び出します。その結果、実行後には $_SESSION 配列が空になっていることが画面上で確認でき、全てのセッション変数が削除されたことが明確にわかります。

注意点として、この関数はあくまでセッション変数を空にするだけで、セッションそのもの(セッションIDや関連ファイル)を破棄するわけではありません。ユーザーのログアウト処理のようにセッションを完全に終了させたい場合は、session_destroy() 関数も併用するのが一般的です。

session_unset() 関数は、セッションに保存された全ての変数を削除し、$_SESSION 配列を空にする機能を持っています。最も注意すべき点は、この関数がセッションの「データ」のみを削除し、セッション自体(セッションID)は破棄しないことです。そのため、この関数を実行してもセッションは有効なまま維持されます。ユーザーのログアウト処理のようにセッションを完全に終了させたい場合は、セッションIDを破棄する session_destroy() 関数も一緒に呼び出すのが一般的です。また、全てのセッション関連の関数は、必ず session_start() を呼び出した後に実行する必要があります。

PHPセッションの解放と破棄を理解する

<?php

/**
 * session_unset() の正しい使い方とセッションを完全に破棄する方法を示すサンプルコード
 *
 * 「php session unset not working」という問題は、多くの場合、セッションを完全に
 * 終了させるために session_destroy() やセッションクッキーの削除が必要であることへの
 * 誤解から生じます。このコードは、その一連の流れを示します。
 */

// セッション関連の関数を使用する前に、必ずセッションを開始します。
session_start();

// ログアウトリンクがクリックされた場合 (例: index.php?action=logout)
if (isset($_GET['action']) && $_GET['action'] === 'logout') {
    // 1. すべてのセッション変数を解放します。
    // これにより $_SESSION 配列は空になりますが、セッション自体はまだ存在します。
    session_unset();

    // 2. セッションを完全に破棄します。
    // サーバー上のセッションファイルが削除されます。
    session_destroy();

    // 3. ブラウザのセッションクッキーを削除します (推奨される手順)。
    // これにより、ユーザーが次にアクセスしたときに新しいセッションが開始されます。
    // この処理がないと、同じセッションIDが送信され続け、意図しない挙動の原因になることがあります。
    if (ini_get("session.use_cookies")) {
        $params = session_get_cookie_params();
        setcookie(
            session_name(),
            '',
            time() - 42000,
            $params["path"],
            $params["domain"],
            $params["secure"],
            $params["httponly"]
        );
    }

    // ログアウト完了メッセージを表示して処理を終了します。
    header("Location: " . strtok($_SERVER["REQUEST_URI"], '?'));
    exit;
}

// セッション変数がまだ設定されていない場合 (例: 初回アクセス時)
if (!isset($_SESSION['user_id'])) {
    echo "<h1>ようこそ!</h1>";
    echo "<p>セッションを開始し、情報を保存します。</p>";
    // サンプル用のセッション変数を設定します。
    $_SESSION['user_id'] = 12345;
    $_SESSION['username'] = 'Taro Yamada';
    $_SESSION['login_time'] = date('Y-m-d H:i:s');
}

// 現在のセッション情報を表示します。
echo "<h2>現在のセッション情報</h2>";
echo "<pre>";
print_r($_SESSION);
echo "</pre>";

// ログアウトするためのリンクを表示します。
echo '<p><a href="?action=logout">ログアウト</a></p>';
echo "<p>ログアウトリンクをクリックすると、上記のセッション情報がすべて破棄されます。</p>";

?>

session_unset()は、現在登録されている全てのセッション変数を解放するための関数です。具体的には、$_SESSIONスーパーグローバル配列を空にしますが、セッション自体(セッションIDなど)はサーバー上に存在し続けます。この関数は引数を取らず、戻り値は常にtrueを返します。

このサンプルコードは、まずsession_start()でセッションを開始し、ユーザー情報などを$_SESSIONに保存します。そして「ログアウト」が実行されると、最初にsession_unset()が呼び出され、保存されていたセッション変数が全てクリアされる様子を示しています。

「php session unset not working」という問題は、session_unset()だけではセッションが完全に終了しないという誤解から生じることがよくあります。ユーザーを完全にログアウトさせるなど、セッションを完全に破棄するためには、この関数の後にサーバー上のセッションファイルを削除するsession_destroy()を呼び出し、さらにブラウザのセッションクッキーをsetcookie()で無効にすることが推奨されます。この一連の流れが、安全なセッション終了処理の正しい手順となります。

セッション関連の関数を扱う際は、いかなる処理よりも先にsession_start()を呼び出す必要があります。session_unset()はセッションに保存された変数($_SESSION)を空にするだけで、セッション自体はサーバー上に残ります。そのため、「変数が消えない」という問題は多くの場合、この仕様の誤解から生じます。ログアウト機能のようにセッションを完全に終了させたい場合は、session_unset()に加えて、サーバー上のセッションデータを削除するsession_destroy()を呼び出します。さらに、ブラウザに残るセッションIDを無効化するためにセッションクッキーを削除する処理も併せて行うと、より安全で確実な実装になります。

【PHP8.x】session_unset関数の使い方 | いっしー@Webエンジニア