session_gc
(PHP 7 >= 7.1.0, PHP 8)
session_gc — セッションデータのガベージコレクションを実行する
説明
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);
}
?>
参考
- session_start() - 新しいセッションを開始、あるいは既存のセッションを再開する
- session_destroy() - セッションに登録されたデータを全て破棄する
- session.gc_probability
User Contributed Notes 2 notes
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)
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.";
}