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

作成日: 更新日:

session_gc関数は、PHPのセッション管理機能において、ガベージコレクション(不要なセッションデータの削除)を実行する関数です。PHPは、セッションデータをファイルやデータベースなどに保存できますが、放置されたセッションデータはストレージを圧迫する可能性があります。session_gc関数は、設定された条件(例えば、セッションの有効期間)に基づいて、古いセッションデータを自動的に削除することで、ストレージ容量を最適化し、セキュリティリスクを軽減します。

この関数は、セッション開始時(session_start()関数呼び出し時)に、session.gc_probabilitysession.gc_divisorの設定に基づいて確率的に実行されます。例えば、session.gc_probability = 1session.gc_divisor = 100と設定されている場合、1%の確率でガベージコレクションが実行されます。また、session.gc_maxlifetimeの設定は、セッションデータが削除されるまでの最大生存期間を秒単位で指定します。

システムエンジニアは、これらの設定を適切に調整することで、セッションデータの削除頻度と保持期間を制御できます。これにより、ユーザーエクスペリエンスを損なうことなく、サーバーリソースを効率的に利用し、セキュリティを維持することが可能になります。session_gc関数自体を直接呼び出すことは稀ですが、関連する設定値を理解し、適切な値に設定することが重要です。

基本的な使い方

構文(syntax)

session_gc() : int

引数(parameters)

引数なし

引数はありません

戻り値(return)

int|false

session_gc関数は、セッションガベージコレクション(不要になったセッションデータの削除)の処理が正常に実行された場合は、削除されたセッションデータの数を整数で返します。処理中にエラーが発生した場合は、falseを返します。

サンプルコード

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

<?php

/**
 * session_gc() を使用してセッションのガベージコレクションを強制実行するサンプル。
 *
 * このスクリプトは、意図的に期限切れのセッションを作成し、
 * session_gc() を呼び出してクリーンアップされることを示します。
 * コマンドライン(CLI)から実行することを想定しています。
 */
function demonstrateSessionGarbageCollection(): void
{
    // 実行環境に影響を与えないよう、一時的なセッション保存パスを設定します。
    $sessionPath = sys_get_temp_dir() . '/php_gc_test_sessions';
    if (!is_dir($sessionPath)) {
        mkdir($sessionPath, 0777, true);
    }
    ini_set('session.save_path', $sessionPath);

    // テストのため、セッションの有効期限を1秒に設定します。
    ini_set('session.gc_maxlifetime', 1);

    // 1. 期限切れになるセッションを作成します。
    session_start();
    $_SESSION['user'] = 'test_user';
    $sessionId = session_id();
    // セッションファイルへの書き込みを確定させるために閉じます。
    session_write_close();
    echo "セッションを作成しました (ID: {$sessionId})。\n";

    // 2. gc_maxlifetime で設定した有効期限が切れるのを待ちます。
    echo "有効期限が切れるまで2秒待機します...\n";
    sleep(2);

    // 3. セッションのガベージコレクションを強制的に実行します。
    //    この関数は、期限切れのセッションファイルを削除します。
    $deletedCount = session_gc();

    if ($deletedCount === false) {
        echo "セッションのガベージコレクションに失敗しました。\n";
    } else {
        // 4. 削除されたセッションの数を表示します。
        echo "session_gc() の実行完了。{$deletedCount}個の期限切れセッションが削除されました。\n";
    }

    // 後片付け: テスト用に作成したディレクトリとファイルを削除します。
    $files = glob($sessionPath . '/*');
    foreach ($files as $file) {
        if (is_file($file)) {
            unlink($file);
        }
    }
    rmdir($sessionPath);
}

demonstrateSessionGarbageCollection();

session_gc()関数は、サーバー上に保存されている有効期限が切れたセッションデータを削除(クリーンアップ)する処理、いわゆるガベージコレクションを強制的に実行するための関数です。PHPのセッション管理では、このクリーンアップ処理は通常、設定に基づいて一定の確率で自動的に行われますが、session_gc()を使うことで任意のタイミングで明示的に実行できます。

この関数は引数を必要としません。

関数の戻り値は、処理が成功した場合に削除されたセッションの数を整数(int)で返します。何らかの理由で処理に失敗した場合はfalseが返されます。

サンプルコードでは、まずini_set()を用いてセッションの有効期限を意図的に1秒という短い時間に設定します。次にテスト用のセッションを作成し、有効期限が切れるのを2秒間待ってからsession_gc()を呼び出しています。その結果、戻り値として削除されたセッションの数が表示され、この関数が期限切れのセッションデータを正常にクリーンアップしたことを確認できます。

session_gc()は、PHPが自動で行うセッションのクリーンアップ処理(ガベージコレクション)を強制的に実行する関数です。通常、この処理はPHPの設定に基づいて自動実行されるため、開発者が手動で呼び出す機会は少ないです。この関数を使用する際は、事前にsession_write_close()などで現在アクティブなセッションを閉じておく必要があります。セッションが開いたままだと期待通りに動作しないため注意してください。どのセッションが削除されるかはsession.gc_maxlifetimeの設定値に依存します。戻り値は削除されたセッションの数で、削除対象がない場合は0が返ります。これはエラーではなく、失敗した場合のみfalseが返されます。Webサーバーでリクエストごとに呼び出すとパフォーマンスに影響を与える可能性があるため、主にバッチ処理など特殊な用途で利用されます。

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