PHP session_destroy() 未由垃圾回收器使用默认的 SESSION 处理程序调用


PHP session_destroy() not called with default SESSION handler by garbage collector?

有没有办法确保默认的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);
?>