【问题标题】:PHP session_destroy() not called with default SESSION handler by garbage collector?垃圾收集器未使用默认 SESSION 处理程序调用 PHP session_destroy()?
【发布时间】:2013-12-01 13:55:12
【问题描述】:

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

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

我猜,唯一的方法是为所有 5 个操作定义自定义会话处理程序 - 打开、关闭、销毁、..? (我的冗余代码)

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

完美的解决方案是例如如果可以注册类似 session_register_destroy(function) 的东西 - 但我不确定这是否可能。

谢谢。

【问题讨论】:

  • 获取活动会话数怎么样? stackoverflow.com/a/17259650/368406
  • 如果您使用会话文件处理程序,那么计算活动会话将涉及枚举会话保存路径目录。这将是一个相对较慢的操作,因为它会进入磁盘,并且根据活动会话的数量,它可能会相当卡顿。你有没有想过这个?
  • 是的,我正在使用标准文件存储。我想避免扫描会话保存路径(例如使用 glob(.)),因为 1/ 这是昂贵的操作 2/ 我必须只计算授予人类用户的会话,因为机器人(通过 http 客户端签名识别)总是被免费授予索引站点。因此,简单的目录扫描不是一种选择。所以看起来实现简单的会话计数器并不是那么简单,对吧? :-)

标签: php session garbage-collection destroy


【解决方案1】:

由于标准文件处理程序的工作方式,没有回调。

会话存储在文件中,PHP 会不时检查该文件是否超过 25 分钟(或者实际上是 session.gc_maxlifetime 秒)没有被触及

如果文件未被触及,则将其删除。
此垃圾收集发生在来自客户端的每 100 个请求时, 因此,如果您的服务器在几个小时内没有收到请求,会话文件将继续存在。

在您的情况下,您可以单独计算会话,例如通过 apc 每次,或者只计算会话目录中 25 分钟前更新的文件数量。

【讨论】:

  • 实际上是每 24 分钟一次(默认为 1440 秒)。我使用的是 Opcache,而不是 APC。有时缓存会完全关闭(开发中)。
  • apc 只是一个建议,您可以在其中存储活动会话数。您也可以在数据库中执行此操作,或者使用 find 计算磁盘上的文件,这些文件是 mitemed 稍后 24 分钟前
【解决方案2】:

编辑:我想我对你想要完成的事情有点困惑。

我相信您可以通过将 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);

?>

【讨论】:

猜你喜欢
  • 2016-01-17
  • 1970-01-01
  • 2011-07-03
  • 2016-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多