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

session_destroy関数の使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

session_destroy関数は、現在のセッションに関連付けられたすべてのデータを破棄する関数です。この関数を実行すると、セッションに登録されていた変数や情報がサーバー側から削除されます。ただし、session_destroy関数自体は、クライアント側のセッションIDを保持するクッキーを削除しません。クッキーを削除するには、setcookie関数などを使用して明示的に削除する必要があります。

session_destroy関数は、セッションを完全に終了させたい場合に利用されます。例えば、ユーザーがログアウトした場合や、一定時間操作がない場合にセッションを破棄することで、セキュリティを向上させることができます。

session_destroy関数を使用する前に、session_start関数でセッションを開始しておく必要があります。セッションが開始されていない状態でsession_destroy関数を実行すると、エラーが発生する可能性があります。

session_destroy関数が正常に実行されると、TRUEを返します。失敗した場合はFALSEを返します。戻り値を確認することで、セッションの破棄が正常に行われたかどうかを確認できます。

session_destroy関数は、セッションデータを削除するだけであり、セッション自体を完全に削除するわけではありません。セッションを完全に削除するには、セッションIDを無効化し、セッションクッキーを削除する必要があります。一般的に、これらの処理はログアウト処理などで行われます。session_destroy関数は、あくまでサーバー側のセッションデータの削除に特化した関数であると理解しておくと良いでしょう。

構文(syntax)

1session_destroy(): bool

引数(parameters)

引数なし

引数はありません

戻り値(return)

bool

セッションの破棄に成功した場合は true を、失敗した場合は false を返します。

サンプルコード

PHP セッションタイムアウトによる自動破棄

1<?php
2
3/**
4 * セッションを開始し、一定時間経過後にセッションを破棄するサンプル
5 */
6function destroySessionAfterTimeout(int $timeoutSeconds): void
7{
8    // セッションを開始
9    session_start();
10
11    // タイムアウト時間を定義
12    $time = $_SERVER['REQUEST_TIME'];
13
14    // セッションが開始された時間を記録
15    if (!isset($_SESSION['session_start'])) {
16        $_SESSION['session_start'] = $time;
17    }
18
19    // タイムアウト時間を過ぎているか確認
20    if (($time - $_SESSION['session_start']) > $timeoutSeconds) {
21        // セッション変数をすべて削除
22        $_SESSION = array();
23
24        // セッションcookieを削除 (クライアント側)
25        if (ini_get("session.use_cookies")) {
26            $params = session_get_cookie_params();
27            setcookie(
28                session_name(),
29                '',
30                $time - 3600,
31                $params["path"],
32                $params["domain"],
33                $params["secure"],
34                $params["httponly"]
35            );
36        }
37
38        // セッションを破棄
39        session_destroy();
40    }
41}
42
43// 30分 (1800秒) 経過後にセッションを破棄する例
44destroySessionAfterTimeout(1800);
45
46// ここにセッションを使用するコードを記述
47$_SESSION['test'] = 'This is a test.';
48echo "Session ID: " . session_id() . "<br>";
49echo "Session Value: " . $_SESSION['test'] . "<br>";
50
51?>

このPHPのサンプルコードは、session_destroy()関数を利用して、一定時間経過後にセッションを破棄する方法を示しています。session_destroy()は、引数を取らず、戻り値としてbool型を返します。セッションの破棄に成功した場合 true、失敗した場合 falseを返します。

まず、session_start()関数でセッションを開始します。destroySessionAfterTimeout()関数は、タイムアウト時間(秒)を引数として受け取り、セッション開始からの経過時間がタイムアウト時間を超えているかどうかをチェックします。

経過時間がタイムアウト時間を超えている場合、まず$_SESSION変数を空の配列で上書きし、セッションに保存されているすべての変数を削除します。次に、クライアント側のセッションcookieを削除します。session.use_cookiesが有効になっている場合、setcookie()関数を使用して、cookieの有効期限を過去に設定することで、cookieを削除します。最後に、session_destroy()関数を呼び出して、サーバー側のセッションデータを削除し、セッションを完全に破棄します。

サンプルコードでは、destroySessionAfterTimeout(1800)という記述で、30分(1800秒)経過後にセッションを破棄するように設定しています。セッションを使用するコードは、この関数の呼び出し後に記述します。ここでは、$_SESSION['test']に値を設定し、セッションIDとセッションの値を出力しています。これにより、セッションが正常に開始され、値が格納されていることを確認できます。

session_destroy()関数は、セッションデータを破棄しますが、セッションID自体は破棄しません。セッションを完全に破棄するには、セッション変数の削除、セッションCookieの削除、そしてsession_destroy()の順に実行する必要があります。

タイムアウト処理を実装する場合、セッション開始時刻を記録し、現在の時刻との差分でタイムアウト判定を行います。$_SERVER['REQUEST_TIME']はリクエスト開始時のタイムスタンプを取得するのに便利です。Cookieを削除する際は、session_get_cookie_params()でCookieの属性を取得し、setcookie()で同じ属性で上書きすることで確実に削除できます。タイムアウト時間は、アプリケーションの要件に合わせて調整してください。session_destroy()の実行後、セッション関連の処理を行う前に、再度session_start()が必要になる場合があります。

PHPセッションタイムアウトと破棄処理

1<?php
2
3/**
4 * PHPセッションタイムアウト処理のサンプル
5 *
6 * この関数は、ウェブアプリケーションにおけるセッションの管理、
7 * 特に非アクティブなセッションのタイムアウト処理をデモンストレーションします。
8 * ユーザーが一定時間($timeoutSecondsで指定)操作を行わなかった場合、
9 * セッションを破棄し、新しいセッションを開始します。
10 *
11 * @param int $timeoutSeconds セッションがタイムアウトするまでの非アクティブ期間(秒)。
12 * @return void
13 */
14function handleSessionTimeout(int $timeoutSeconds = 30): void
15{
16    // セッションクッキーのパラメータを設定します。
17    // session_start() より前に呼び出す必要があります。
18    // 'lifetime' を0に設定すると、ブラウザを閉じるとセッションクッキーが削除されます。
19    // このデモでは、PHPロジックでタイムアウトを制御するため、主にセキュリティ設定を行います。
20    $cookieParams = [
21        'lifetime' => 0, // ブラウザを閉じるまでセッションクッキーを保持
22        'path' => '/',
23        'domain' => '', // 空文字列で現在のホストに設定
24        'secure' => isset($_SERVER['HTTPS']), // HTTPS接続の場合のみSecure属性を有効にする
25        'httponly' => true, // JavaScriptからのアクセスを禁止し、XSS攻撃のリスクを低減
26        'samesite' => 'Lax' // CSRF対策。'Strict'または'None'も選択肢ですが、'Lax'が一般的。
27    ];
28    session_set_cookie_params($cookieParams);
29
30    // セッションを開始します。
31    // これにより、既存のセッションIDに基づいてセッションデータが読み込まれるか、
32    // 新しいセッションが開始されます。
33    session_start();
34
35    // ユーザーへのメッセージを保持する配列
36    $messages = [];
37
38    // セッションに 'last_activity'(最終活動時刻)が存在し、かつタイムアウト期間を超えているかチェック
39    if (isset($_SESSION['last_activity']) && (time() - $_SESSION['last_activity'] > $timeoutSeconds)) {
40        // --- セッションがタイムアウトした場合の処理 ---
41
42        // セッション変数をすべてクリアします。
43        // $_SESSION配列から登録されたすべての変数を削除します。
44        session_unset();
45
46        // セッションを完全に破棄します。
47        // これはサーバー上のセッションデータファイルなどを削除します。
48        // session_destroy() の戻り値は bool ですが、ここでは利用しません。
49        session_destroy();
50
51        // セッションIDを含むクッキーを削除します。
52        // session_destroy() はセッションIDクッキーを自動的には削除しません。
53        // クライアント(ブラウザ)側に残ったセッションIDクッキーを無効化するため、
54        // 過去の時刻を指定して同じ名前のクッキーを再設定します。
55        setcookie(
56            session_name(), // 現在のセッション名 (例: PHPSESSID)
57            '',             // 値を空にする
58            [
59                'expires' => time() - 3600, // 有効期限を過去に設定して即座に削除
60                'path' => $cookieParams['path'],
61                'domain' => $cookieParams['domain'],
62                'secure' => $cookieParams['secure'],
63                'httponly' => $cookieParams['httponly'],
64                'samesite' => $cookieParams['samesite']
65            ]
66        );
67
68        $messages[] = 'セッションがタイムアウトしました。';
69
70        // 破棄後に新しいセッションを再開します。
71        // これにより、新しいセッションIDが生成され、新しいセッションが開始されます。
72        session_start();
73        $messages[] = '新しいセッションが開始されました。';
74
75        // 新しいセッションの活動時間を記録します。
76        $_SESSION['last_activity'] = time();
77        $_SESSION['status'] = 'new_session_after_timeout';
78
79    } else {
80        // --- セッションがアクティブな場合、または初回アクセスの場合の処理 ---
81
82        if (!isset($_SESSION['last_activity'])) {
83            // セッションへの初回アクセス時
84            $messages[] = 'このセッションは初めて開始されました。';
85            $_SESSION['status'] = 'initial_session_start';
86        } else {
87            // タイムアウトしていない場合
88            $messages[] = 'セッションは現在アクティブです。';
89            $_SESSION['status'] = 'session_active';
90        }
91        // 現在の活動時間を記録して、タイムアウトカウンタをリセットします。
92        $_SESSION['last_activity'] = time();
93    }
94
95    // ユーザーへのフィードバックと現在のセッション情報の表示 (HTML出力)
96    echo '<h1>セッションタイムアウト処理サンプル</h1>';
97    echo '<p>設定されたタイムアウト時間: <strong>' . htmlspecialchars((string) $timeoutSeconds) . '秒</strong></p>';
98    echo '<ul>';
99    foreach ($messages as $msg) {
100        echo '<li>' . htmlspecialchars($msg) . '</li>';
101    }
102    echo '</ul>';
103
104    echo '<h2>現在のセッション情報 ($_SESSION)</h2>';
105    echo '<pre>';
106    var_dump($_SESSION);
107    echo '</pre>';
108
109    echo '<h2>セッションID</h2>';
110    echo '<p>' . htmlspecialchars(session_id()) . '</p>';
111
112    echo '<h2>セッションクッキー情報 (サーバー側で受信した$_COOKIE)</h2>';
113    echo '<pre>';
114    var_dump($_COOKIE); // ブラウザから送信されてきたクッキー情報
115    echo '</pre>';
116
117    echo '<p>このページを<strong>' . htmlspecialchars((string) $timeoutSeconds) . '秒以内</strong>にリロードするとセッションは継続されます。</p>';
118    echo '<p><strong>' . htmlspecialchars((string) $timeoutSeconds) . '秒以上</strong>待ってから再度アクセスするとセッションがタイムアウトし、リセットされます。</p>';
119}
120
121// サンプルコードとして単体で動作させるための呼び出し
122// セッションタイムアウトを30秒に設定して関数を実行します。
123handleSessionTimeout(30);
124
125?>

PHPのsession_destroy関数は、ウェブアプリケーションでユーザーのセッションを完全に終了させるために使われる重要な関数です。この関数は引数を取らず、サーバー側に保存されている現在のセッションデータをすべて破棄します。処理が成功するとtrue、失敗するとfalseが戻り値として返されます。

提供されたサンプルコードでは、セッションのタイムアウト処理にsession_destroyを活用しています。ユーザーが一定時間操作を行わなかった場合、セキュリティの観点から既存のセッションを破棄し、新しいセッションを開始します。具体的には、まずsession_unset()でセッション内のすべての変数をクリアした後、session_destroy()を呼び出してサーバー上のセッションファイルを削除します。

ここで注意が必要なのは、session_destroy()だけではブラウザに残るセッションIDクッキーは自動的に削除されない点です。そのため、サンプルコードではsetcookie()関数を使用し、セッション名のクッキーの有効期限を過去に設定することで、クライアント側のクッキーも強制的に無効化しています。これにより、セッションが完全に終了し、安全に新しいセッションを開始できる状態が作られます。このように、session_destroy()setcookie()を組み合わせることで、セッションの完全なリセットを実現し、セッションハイジャックなどのリスクを低減できるのです。

session_destroy()はサーバー上のセッションデータを完全に削除しますが、クライアント(ブラウザ)に保存されたセッションIDクッキーは自動で削除されないため、setcookie()で明示的に削除する必要があります。これにより、古いセッションIDの不正な再利用を防ぐことができます。セッションを破棄した後に新しいセッションを再開したい場合は、必ず再度session_start()を呼び出してください。これにより新しいセッションIDが発行され、セッション固定攻撃対策にも繋がります。また、session_set_cookie_params()securehttponlysamesiteといったクッキー属性を適切に設定することは、セッションセキュリティを向上させる上で非常に重要です。特にHTTPS環境ではsecureを有効にしてください。session_unset()がセッション変数のみをクリアするのに対し、session_destroy()はセッション自体を終了させるという違いを理解しておくことが大切です。HTML出力の際には、必ずhtmlspecialchars()でエスケープ処理を行い、XSS(クロスサイトスクリプティング)対策を施してください。

PHPセッションをブラウザで閉じる時に破棄する

1<?php
2
3// Start the session. This must be called before accessing $_SESSION.
4// It initializes the session mechanism and loads any existing session data.
5session_start();
6
7// --- Session Destruction Logic (e.g., for a "logout" action) ---
8
9// Check if a 'logout' action has been requested, typically via a URL parameter.
10if (isset($_GET['action']) && $_GET['action'] === 'logout') {
11    // 1. Unset all session variables.
12    // This clears the $_SESSION superglobal array for the current script.
13    $_SESSION = array();
14
15    // 2. If session cookies are used, delete the session cookie.
16    // This is crucial for a complete logout from the client's perspective,
17    // ensuring the browser no longer sends the session ID.
18    if (ini_get("session.use_cookies")) {
19        $params = session_get_cookie_params();
20        setcookie(
21            session_name(), // The name of the session cookie (e.g., PHPSESSID)
22            '',             // An empty value
23            time() - 42000, // A time in the past to expire the cookie immediately
24            $params["path"],
25            $params["domain"],
26            $params["secure"],
27            $params["httponly"]
28        );
29    }
30
31    // 3. Destroy the session data on the server.
32    // This removes the session file from the server's session save path.
33    // Returns true on success, false on failure.
34    $sessionDestroyed = session_destroy();
35
36    // Redirect the user to the same page (or a different one) to show the effect.
37    // Using header() for redirection prevents further output and ensures a clean state.
38    header('Location: ?message=' . ($sessionDestroyed ? 'Session_destroyed_successfully!' : 'Failed_to_destroy_session!'));
39    exit; // Stop script execution after redirection.
40}
41
42// --- Session Initialization and Display Logic ---
43
44// If 'username' is not set in the session, it's a new session or after destruction.
45if (!isset($_SESSION['username'])) {
46    $_SESSION['username'] = 'Guest_User'; // Set some example data
47    $_SESSION['login_time'] = date('Y-m-d H:i:s');
48    $_SESSION['visit_count'] = 0;
49}
50
51// Increment visit count for demonstration purposes.
52$_SESSION['visit_count']++;
53
54?>
55<!DOCTYPE html>
56<html lang="en">
57<head>
58    <meta charset="UTF-8">
59    <meta name="viewport" content="width=device-width, initial-scale=1.0">
60    <title>PHP Session Destroy Example</title>
61    <style>
62        body { font-family: sans-serif; margin: 20px; line-height: 1.6; }
63        .message { color: green; font-weight: bold; }
64        .info { color: #333; }
65        .action-link { display: inline-block; margin-top: 20px; padding: 10px 15px; background-color: #f44336; color: white; text-decoration: none; border-radius: 5px; }
66        .action-link:hover { background-color: #d32f2f; }
67        .note { margin-top: 40px; font-size: 0.9em; color: #555; border-top: 1px solid #eee; padding-top: 20px;}
68    </style>
69</head>
70<body>
71    <h1>PHP Session Management</h1>
72
73    <?php if (isset($_GET['message'])): ?>
74        <p class="message"><?php echo htmlspecialchars(str_replace('_', ' ', $_GET['message'])); ?></p>
75    <?php endif; ?>
76
77    <?php if (isset($_SESSION['username'])): ?>
78        <div class="info">
79            <p>Welcome, <strong><?php echo htmlspecialchars($_SESSION['username']); ?></strong>!</p>
80            <p>Login time: <?php echo htmlspecialchars($_SESSION['login_time']); ?></p>
81            <p>You have visited this page <strong><?php echo htmlspecialchars($_SESSION['visit_count']); ?></strong> time(s) in this session.</p>
82            <p>Your current Session ID: <code><?php echo htmlspecialchars(session_id()); ?></code></p>
83            <a href="?action=logout" class="action-link">Log out (Destroy Session)</a>
84        </div>
85    <?php else: ?>
86        <div class="info">
87            <p>No active session data found. The session might have been destroyed or never started.</p>
88            <p>Refresh the page or click below to start a new session.</p>
89            <a href="/" class="action-link" style="background-color: #4CAF50;">Start New Session</a>
90        </div>
91    <?php endif; ?>
92
93    <p class="note">
94        <em>
95            This example demonstrates how to explicitly destroy a PHP session.
96            While PHP session cookies are typically set to expire when the browser closes,
97            `session_destroy()` provides a way to end the session immediately on the server-side.
98            For a complete "logout" experience, it's essential to not only call `session_destroy()`
99            but also to unset all `$_SESSION` variables and delete the session cookie on the client's browser.
100            This ensures that no lingering session data or cookie remains active.
101        </em>
102    </p>
103
104</body>
105</html>

PHPのsession_destroy関数は、現在アクティブなセッションに保存されている全てのデータ(サーバー上のセッションファイル)を完全に破棄するために使用されます。この関数は引数をとりません。セッションの破棄に成功した場合はtrueを、失敗した場合はfalseをブール値として返します。

ウェブアプリケーションにおけるログアウト機能などで、ユーザーのセッションを明示的に終了させたい場合に利用されます。セッションデータは通常、ブラウザを閉じると期限切れになる設定が多いですが、session_destroyを使うことで、ブラウザの状態に関わらずサーバー側で即座にセッションを削除できます。

サンプルコードでは、ユーザーが「ログアウト」アクションを実行した際に、session_destroyを呼び出してサーバー上のセッションデータを削除しています。しかし、完全なログアウトを実現するためには、session_destroyの呼び出しに加え、$_SESSIONスーパーグローバル変数に格納されている全てのセッションデータを空にし、さらにクライアント側に保存されているセッションクッキーも削除することが重要です。これにより、サーバーとクライアントの両方からセッション情報が完全に消去され、セキュリティが向上します。

session_destroy()関数はサーバー上のセッションデータファイルを削除しますが、それだけでは不完全です。クライアント側のブラウザに残るセッションクッキーや、PHPスクリプト内で使用中の$_SESSIONスーパーグローバル変数には影響しません。

完全にセッションを破棄し、安全なログアウトを実装するには、以下の3つの手順全てが必要です。まず$_SESSION = array();としてセッション変数を全てクリアします。次にsetcookie()関数を用いて、ブラウザに保存されているセッションクッキーを削除します。最後にsession_destroy()を呼び出してサーバー上のセッションファイルを破棄します。

これらの処理を適切に行うことで、ブラウザを閉じた際のセッション終了とは異なり、即座にセッションがサーバー・クライアント両方から完全に消去され、セキュリティ面でもより安全な状態となります。なお、セッション関連の操作を行う前には、必ずsession_start()関数を呼び出す必要があります。

関連コンテンツ

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