有没有办法确保默认的PHP SESSION垃圾收集器在销毁过期会话时会调用一些函数?
根据我的经验,默认的PHP垃圾收集器在销毁会话时不会调用任何回调函数。
我想,唯一的方法是为所有 5 个操作定义自定义会话处理程序 - 打开、关闭、销毁等。(对我来说是多余的代码)
原因是,我需要调整活动会话的计数器。
完美的解决方案是例如,是否可以注册类似 session_register_destroy(函数) 的东西 - 但我不确定这是否可能。
谢谢。
由于标准文件处理程序的工作方式,没有回调。
会话存储在文件中,PHP 会时不时地检查此文件是否超过 25 分钟(或实际 session.gc_maxlifetime
秒)未被触摸
如果未触及该文件,则会将其删除。
此垃圾回收发生在来自客户端的每 100 个请求上,因此,如果您的服务器在几个小时内没有遇到任何请求,会话文件将继续存在。
在您的情况下,您可以单独计算会话,比如说每次都通过 apc
,或者只计算会话目录中比 25 分钟前更新的文件数量。
编辑:我想我对你想要完成的事情有点困惑。
我相信你可以通过将PHP会话逻辑包装在一个类中来做你想做的事,然后在对象被破坏或清理时使用__destruct()
方法。
<?
class Session
{
public function __construct() {
session_start();
$_SESSION = array();
}
public function set($key, $value) {
$_SESSION[$key] = $value;
}
public function get($key) {
return $_SESSION[$key];
}
public function __destruct() {
// Destroy browser session cookies
if (ini_get("session.use_cookies")) {
$params = session_get_cookie_params();
setcookie(
session_name(), '', time() - 42000,
$params["path"], $params["domain"],
$params["secure"], $params["httponly"]
);
}
session_destroy();
}
}
$session = Session();
$session->set('foo', 'bar');
echo $session->get('foo');
// Destory Session
unset($session);
?>