PHP Conference Japan 2024

session_gc

(PHP 7 >= 7.1.0, PHP 8)

session_gc執行 Session 資料垃圾回收

說明

session_gc(): int|false

session_gc() 用於執行 Session 資料的垃圾回收 (GC)。PHP 預設會以機率為基礎執行 Session GC。

基於機率的 GC 雖然有效,但仍存在一些問題。1) 低流量網站的 Session 資料可能無法在預期時間內刪除。2) 高流量網站的 GC 可能過於頻繁。3) GC 是根據使用者請求執行的,使用者將會感受到 GC 延遲。

因此,建議對於正式系統,使用例如 UNIX 類系統的 "cron" 定期執行 GC。請務必透過將 session.gc_probability 設定為 0 來停用基於機率的 GC。

參數

此函數沒有參數。

回傳值

session_gc() 成功時返回刪除的 session 資料數量,失敗時返回 false

舊的儲存處理器不會返回刪除的 session 資料數量,只會返回成功/失敗標記。在這種情況下,刪除的 session 資料數量會變成 1,無論實際刪除的資料數量為何。

範例

範例 #1 session_gc() 適用於 cron 等任務管理器的範例

<?php
// 注意:此腳本應由與網頁伺服器程序相同的使用者執行。

// 需要啟動 session 以初始化 session 資料儲存存取。
session_start();

// 立即執行 GC
session_gc();

// 清理由 session_gc() 建立的 session 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);
}
?>

參見

新增筆記

使用者貢獻的筆記 1 則筆記

ridaelkouri at gmail dot com
1 個月前
`session.gc()` 函式似乎無法單獨運作。它會刪除伺服器上的數據,但數據會以 Cookie 的形式保留在瀏覽器中。以下程式碼會刪除伺服器上的 Session 檔案,但不會刪除瀏覽器上的 Cookie。

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

// 啟動 Session
session_start();
$_SESSION['test'] = '暫時資料';

session_write_close();

// 等待 15 秒以確保 Session 過期
sleep(15);

// 手動重新啟動 Session 以觸發 Session 處理
session_start();

session_gc();

// 檢查 Session 資料是否仍然可用
if (isset($_SESSION['test'])) {
echo "Session 仍然有效。";
} else {
echo "Session 已過期且檔案已刪除。";
}

但以下程式碼會刪除伺服器上的 Session 檔案,同時也會刪除 Cookie 並清空全域變數 $_SESSION

session_start();
$_SESSION['test'] = '暫時資料';

session_write_close();

// 等待 15 秒以確保 Session 過期
sleep(15);

session_start();

// 手動觸發垃圾回收
setcookie(session_name(), '', time() - 10);
$_SESSION = [];
session_gc();

// 檢查 Session 資料是否仍然可用
if (isset($_SESSION['test'])) {
echo "Session 仍然有效。";
} else {
echo "Session 已過期且檔案已刪除。";
}
To Top