【PHP8.x】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)

session_destroy(): bool

引数(parameters)

引数なし

引数はありません

戻り値(return)

bool

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

サンプルコード

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

<?php

/**
 * セッションを開始し、一定時間経過後にセッションを破棄するサンプル
 */
function destroySessionAfterTimeout(int $timeoutSeconds): void
{
    // セッションを開始
    session_start();

    // タイムアウト時間を定義
    $time = $_SERVER['REQUEST_TIME'];

    // セッションが開始された時間を記録
    if (!isset($_SESSION['session_start'])) {
        $_SESSION['session_start'] = $time;
    }

    // タイムアウト時間を過ぎているか確認
    if (($time - $_SESSION['session_start']) > $timeoutSeconds) {
        // セッション変数をすべて削除
        $_SESSION = array();

        // セッションcookieを削除 (クライアント側)
        if (ini_get("session.use_cookies")) {
            $params = session_get_cookie_params();
            setcookie(
                session_name(),
                '',
                $time - 3600,
                $params["path"],
                $params["domain"],
                $params["secure"],
                $params["httponly"]
            );
        }

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

// 30分 (1800秒) 経過後にセッションを破棄する例
destroySessionAfterTimeout(1800);

// ここにセッションを使用するコードを記述
$_SESSION['test'] = 'This is a test.';
echo "Session ID: " . session_id() . "<br>";
echo "Session Value: " . $_SESSION['test'] . "<br>";

?>

この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()が必要になる場合があります。

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