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

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)

1session_gc() : int

引数(parameters)

引数なし

引数はありません

戻り値(return)

int|false

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

サンプルコード

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

1<?php
2
3/**
4 * session_gc() を使用してセッションのガベージコレクションを強制実行するサンプル。
5 *
6 * このスクリプトは、意図的に期限切れのセッションを作成し、
7 * session_gc() を呼び出してクリーンアップされることを示します。
8 * コマンドライン(CLI)から実行することを想定しています。
9 */
10function demonstrateSessionGarbageCollection(): void
11{
12    // 実行環境に影響を与えないよう、一時的なセッション保存パスを設定します。
13    $sessionPath = sys_get_temp_dir() . '/php_gc_test_sessions';
14    if (!is_dir($sessionPath)) {
15        mkdir($sessionPath, 0777, true);
16    }
17    ini_set('session.save_path', $sessionPath);
18
19    // テストのため、セッションの有効期限を1秒に設定します。
20    ini_set('session.gc_maxlifetime', 1);
21
22    // 1. 期限切れになるセッションを作成します。
23    session_start();
24    $_SESSION['user'] = 'test_user';
25    $sessionId = session_id();
26    // セッションファイルへの書き込みを確定させるために閉じます。
27    session_write_close();
28    echo "セッションを作成しました (ID: {$sessionId})。\n";
29
30    // 2. gc_maxlifetime で設定した有効期限が切れるのを待ちます。
31    echo "有効期限が切れるまで2秒待機します...\n";
32    sleep(2);
33
34    // 3. セッションのガベージコレクションを強制的に実行します。
35    //    この関数は、期限切れのセッションファイルを削除します。
36    $deletedCount = session_gc();
37
38    if ($deletedCount === false) {
39        echo "セッションのガベージコレクションに失敗しました。\n";
40    } else {
41        // 4. 削除されたセッションの数を表示します。
42        echo "session_gc() の実行完了。{$deletedCount}個の期限切れセッションが削除されました。\n";
43    }
44
45    // 後片付け: テスト用に作成したディレクトリとファイルを削除します。
46    $files = glob($sessionPath . '/*');
47    foreach ($files as $file) {
48        if (is_file($file)) {
49            unlink($file);
50        }
51    }
52    rmdir($sessionPath);
53}
54
55demonstrateSessionGarbageCollection();

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サーバーでリクエストごとに呼び出すとパフォーマンスに影響を与える可能性があるため、主にバッチ処理など特殊な用途で利用されます。

PHP session_gc() によるセッションGC実行

1<?php
2
3// セッションを開始します。
4// セッションにデータを書き込むことで、セッションファイルが作成されます。
5session_start();
6
7// セッションデータの設定例。これにより、セッションファイルが確実に作成されます。
8$_SESSION['user_id'] = 1;
9$_SESSION['last_activity'] = time();
10
11echo "セッションが開始され、データが設定されました。<br>";
12echo "現在のセッションID: " . session_id() . "<br><br>";
13
14// session_gc() を呼び出して、古いセッションファイルのガーベージコレクションを手動で実行します。
15// PHPは通常、'session.gc_probability' や 'session.gc_divisor' の設定に基づいて
16// 自動的にガーベージコレクションを実行しますが、この関数はそれを明示的にトリガーします。
17// 戻り値は削除された古いセッションファイルの数、または失敗した場合は false です。
18$deleted_count = session_gc();
19
20if ($deleted_count === false) {
21    echo "セッションのガーベージコレクションに失敗しました。<br>";
22} else {
23    echo "セッションのガーベージコレクションが実行されました。<br>";
24    echo "削除された古いセッションファイルの数: " . $deleted_count . " 件<br>";
25}
26
27// セッションを終了し、データを保存します。
28// この呼び出しがない場合でも、スクリプト終了時に自動的に行われます。
29session_write_close();
30
31?>

PHPのsession_gc()関数は、期限切れの古いセッションファイルを削除するガーベージコレクション(GC)処理を手動で実行するために使用されます。まずsession_start()でセッションを開始し、$_SESSION変数にデータを書き込むことでセッションファイルが作成されます。この関数は引数をとりません。PHPは通常、session.gc_probabilityなどの設定に基づき自動的にGCを実行しますが、session_gc()を呼び出すことで、開発者が任意のタイミングで明示的にこの処理をトリガーできます。関数の戻り値は、削除された古いセッションファイルの数を整数(int)で返します。もしGC処理が失敗した場合はfalseを返します。サンプルコードでは、セッションの開始とデータ設定後にsession_gc()を実行し、削除されたファイルの数を確認しています。最後にsession_write_close()でセッションを終了し、データを保存しています。

session_gc()関数は、PHPが通常php.inisession.gc_probabilityなどの設定に基づき自動で行うセッションのガーベージコレクション(GC)を、手動で即座に実行したい場合に利用します。この関数を呼び出す際は、必ずsession_start()でセッションが開始されている必要があります。戻り値は削除されたファイルの数または失敗を示すfalseのため、エラーハンドリングのために常に確認してください。通常、この関数を明示的に呼ぶケースは稀で、自動GC設定を無効化して特定のタイミングで手動GCを行うような特殊な運用に限られます。また、ファイル以外のセッション保存方法(DB、Redisなど)を利用している場合は効果がない点にご注意ください。

PHP session_gc() による手動GC実行

1<?php
2
3/**
4 * PHPのセッション自動ガベージコレクション (GC) が無効になっている場合に
5 * session_gc() 関数を使って手動でGCを実行する方法を示します。
6 *
7 * session.gc_probability = 0 は、PHPが古いセッションファイルを
8 * 自動的に削除しないように設定することを意味します。
9 * この場合、セッションファイルは手動でクリーンアップする必要があります。
10 */
11
12// 1. セッションの自動ガベージコレクションを無効にします。
13//    'session.gc_probability' を '0' に設定すると、PHPは自動的に古いセッションを削除しません。
14//    'session.gc_divisor' は確率計算に使用されますが、probabilityが0の場合、効果はありません。
15ini_set('session.gc_probability', '0');
16ini_set('session.gc_divisor', '1');
17
18// 2. セッションを開始または再開します。
19//    セッション関数を使用するには、session_start() の呼び出しが必要です。
20session_start();
21
22// 3. ダミーのセッションデータを保存します。
23//    これは、セッションが作成され、データが格納されていることをシミュレートします。
24$_SESSION['user_id'] = 123;
25$_SESSION['username'] = 'beginner_se';
26$_SESSION['last_activity'] = time();
27
28echo "セッションが開始され、データが保存されました。\n";
29echo "自動セッションガベージコレクションは無効です (gc_probability = 0)。\n\n";
30
31// 4. セッションのガベージコレクションを手動でトリガーします。
32//    この関数は、セッション保存パス内の期限切れのセッションファイルを
33//    クリーンアップしようと試みます。
34echo "手動でセッションガベージコレクションを実行しようとしています...\n";
35$collectedSessionsCount = session_gc();
36
37// 5. session_gc() の結果を確認します。
38//    成功した場合は削除されたセッションファイルの数が返され、
39//    失敗した場合は false が返されます。
40if ($collectedSessionsCount === false) {
41    echo "エラー: 手動セッションガベージコレクションに失敗しました。\n";
42} else {
43    echo "成功: 手動セッションガベージコレクションが完了しました。\n";
44    echo "削除された期限切れセッションの数: " . $collectedSessionsCount . "件\n";
45}
46
47// 6. オプション: 現在のセッションを終了します。
48//    これはガベージコレクションとは直接関係ありませんが、セッション管理の一般的なステップです。
49// session_destroy(); // この行をコメント解除すると、現在のセッションが削除されます。
50
51echo "\nスクリプトが終了しました。\n";
52echo "期限切れのセッションが存在していた場合、それらはクリーンアップされたはずです。\n";
53
54?>

このサンプルコードは、PHPのセッション自動ガベージコレクション (GC) が無効になっている状況で、session_gc() 関数を使用して手動でセッションをクリーンアップする方法を示しています。

まず、ini_set('session.gc_probability', '0') を設定することで、PHPが古いセッションファイルを自動的に削除しないようにします。これは、自動的なセッションの破棄を停止し、手動での管理が必要となる状態を意図的に作り出しています。

次に、session_start() でセッションを開始し、ダミーのセッションデータを保存します。これは、セッションが実際に作成され、データが格納されている状態をシミュレートしています。

その後、引数なしで session_gc() 関数が呼び出されます。この関数は、設定されたセッション保存パス内にある期限切れのセッションファイルを能動的に探し出し、削除を試みます。処理が成功すると、削除されたセッションファイルの数が整数(int)として返されます。もし何らかの理由で処理に失敗した場合は false が戻り値となります。サンプルコードでは、この戻り値を確認し、処理の成功または失敗、および削除されたファイルの数を表示しています。

このように、session_gc() 関数を利用することで、自動GCに依存せず、開発者が任意のタイミングでセッションストレージの整理を実行できるようになります。

このコードは、自動セッションガベージコレクション(GC)を無効にし、手動でsession_gc()を実行する例です。session.gc_probability = 0を設定すると、PHPは古いセッションを自動で削除しなくなるため、本番環境では定期的なsession_gc()の実行が必須となります。session_gc()を呼び出す前には必ずsession_start()が必要です。また、session_gc()は成功すると削除されたセッション数(整数)を、失敗するとfalseを返しますので、戻り値を適切に確認しエラーハンドリングを行うことが重要です。ini_setでの設定はスクリプトの実行中のみ有効なため、永続的な設定にはphp.iniでの変更を検討してください。この関数は期限切れのセッションを削除するもので、現在のセッションを削除するものではありません。

関連コンテンツ

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