phpday 2025 - Call For Papers

session_gc

(PHP 7 >= 7.1.0, PHP 8)

session_gcセッションデータのガベージコレクションを実行する

説明

session_gc(): int|false

session_gc() は、セッションデータの GC (ガベージコレクション) を実行するために使用されます。PHPは、デフォルトで確率ベースのセッション GC を行います。

確率ベースの GC は多少は機能しますが、いくつかの問題があります。 1) トラフィックが少ないサイトのセッションデータは、優先期間内に削除されないことがあります。 2) トラフィックの多いサイトでは、GC が頻繁になる可能性があります。 3) ユーザーの要求の際に GC が実行され、ユーザーは GC 遅延を感じます。

そのため、例えば UNIX 系のシステムでは「cron」を使用して、 本稼動システムに対して定期的に GC を実行することをお勧めします。 session.gc_probability を 0 に設定して、 確率ベースのGCを無効にしてください。

パラメータ

この関数にはパラメータはありません。

戻り値

session_gc() は、 成功時には削除されたセッションデータの数、 失敗時には false を返します。

古いセーブハンドラは、削除されたセッションデータの数を返さず、成功/失敗フラグのみを返します。 この場合、実際に削除されたデータにかかわらず、削除されたセッションデータの数は 1 になります。

例1 cron のようなタスクマネージャでの session_gc() の例

<?php
// 注 : このスクリプトは、Web サーバープロセスと同じユーザーで実行される必要があります。

// セッションデータストレージアクセスを初期化するには、アクティブセッションが必要です。
session_start();

// 直ちに GC を実行します
session_gc();

// session_gc() によって作成されたセッション ID をクリーンアップします
session_destroy();
?>

例2 ユーザーがアクセス可能なスクリプトでの session_gc() の例

<?php
// 注 : session_gc() は、タスクマネージャスクリプトで使用することをお勧めしますが、次のように使用できます。

// 最後の GC 時間チェックに使用
$gc_time = '/tmp/php_session_last_gc';
$gc_period = 1800;

session_start();
// GC 期限が経過したときにのみ GC を実行します。
// つまり、リクエストのたびに session_gc() をコールすることはリソースの無駄です。
if (file_exists($gc_time)) {
if (
filemtime($gc_time) < time() - $gc_period) {
session_gc();
touch($gc_time);
}
} else {
touch($gc_time);
}
?>

参考

add a note

User Contributed Notes 2 notes

up
0
i dot carvallo at gmail dot com
2 days ago
Do not use:

if (session_gc() == false)
OR
if (!session_gc())

to evaluate if the garbage collector was triggered successfully since it also returns how many sessions it deleted, which can be 0 (and that evaluates to false with loose operators).

Sounds dumb, but it's a pitfall i fell into and it generated some confusion. Instead, use strict operator "===":

if (session_gc() === false)
up
0
ridaelkouri at gmail dot com
1 month ago
The session.gc() function does not seem to work alone. it deletes the data on the server but the data remains on the browser in the form of the cookie. the following code deletes the session files on the server but not on the browser.

ini_set('session.gc_maxlifetime', 10);
ini_set('session.gc_probability', 1);
ini_set('session.gc_divisor', 1);

// Start the session
session_start();
$_SESSION['test'] = 'temporary data';

session_write_close();

// Wait for 15 seconds to ensure the session expires
sleep(15);

// Manually start the session again to trigger session handling
session_start();

session_gc();

// Check if the session data is still available
if (isset($_SESSION['test'])) {
echo "Session is still active.";
} else {
echo "Session expired and file deleted.";
}

but this code delete the session files on the server and also deletes the cookie as well as making the super global empty:

session_start();
$_SESSION['test'] = 'temporary data';

session_write_close();

// Wait for 15 seconds to ensure the session expires
sleep(15);

session_start();

// Manually trigger garbage collection
setcookie(session_name(), '', time() - 10);
$_SESSION = [];
session_gc();

// Check if the session data is still available
if (isset($_SESSION['test'])) {
echo "Session is still active.";
} else {
echo "Session expired and file deleted.";
}
To Top