PHP session_destroy()没有使用垃圾收集器的默认SESSION处理程序调用?

时间:2013-11-18 12:05:52

标签: php session garbage-collection destroy

有没有办法确保默认的PHP SESSION垃圾收集器会在销毁过期的会话时调用某个函数?

根据我的经验,默认的PHP垃圾收集器在销毁会话时不会调用任何回调函数。

我想,唯一的方法是为所有5个操作定义自定义会话处理程序 - open,close,destroy,..? (我的冗余代码)

原因是,我需要为活动会话调整计数器。

完美的解决方案将是例如如果可以注册像session_register_destroy(函数)这样的东西 - 但我不确定这是否可行。

谢谢。

2 个答案:

答案 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);

?>