PHP Conference Japan 2024

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 session_gc() 用于像cron这样的任务管理器的示例

<?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);
}
?>

参见

添加注释

用户贡献的注释 1 条注释

0
ridaelkouri at gmail dot com
一个月前
session.gc() 函数似乎无法单独工作。它删除了服务器上的数据,但数据以 Cookie 的形式保留在浏览器中。以下代码删除了服务器上的会话文件,但没有删除浏览器上的会话文件。

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

// 启动会话
session_start();
$_SESSION['test'] = 'temporary data';

session_write_close();

// 等待15秒以确保会话过期
sleep(15);

// 手动再次启动会话以触发会话处理
session_start();

session_gc();

// 检查会话数据是否仍然可用
if (isset($_SESSION['test'])) {
echo "Session is still active.";
} else {
echo "Session expired and file deleted.";
}

但是这段代码删除了服务器上的会话文件,也删除了cookie,并使超全局变量为空

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

session_write_close();

// 等待15秒以确保会话过期
sleep(15);

session_start();

// 手动触发垃圾回收
setcookie(session_name(), '', time() - 10);
$_SESSION = [];
session_gc();

// 检查会话数据是否仍然可用
if (isset($_SESSION['test'])) {
echo "Session is still active.";
} else {
echo "Session expired and file deleted.";
}
To Top