有没有办法确保默认的PHP SESSION垃圾收集器会在销毁过期的会话时调用某个函数?
根据我的经验,默认的PHP垃圾收集器在销毁会话时不会调用任何回调函数。
我想,唯一的方法是为所有5个操作定义自定义会话处理程序 - open,close,destroy,..? (我的冗余代码)
原因是,我需要为活动会话调整计数器。
完美的解决方案将是例如如果可以注册像session_register_destroy(函数)这样的东西 - 但我不确定这是否可行。
谢谢。
答案 0 :(得分:0)
由于标准文件处理程序的工作方式,因此没有回调。
会话存储在文件和PHP中,如果有超过25分钟(或实际session.gc_maxlifetime
秒)未触摸此文件,则会立即检查
如果未触摸该文件,则将其删除 这个垃圾收集发生在来自客户的每100个请求上, 因此,如果您的服务器没有经历几个小时的请求,会话文件将继续存在。
在您的情况下,您可以单独计算会话数,让我们每次都通过apc
计算,或者只计算会话目录中25分钟前更新的文件数量。
答案 1 :(得分:0)
编辑:我想我对你想要完成的事情感到困惑。
我相信你可以通过在一个类中包装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);
?>