【问题标题】:Symfony2 - PDO sessions - Do I need to delete records manually or is everything automatic?Symfony2 - PDO 会话 - 我需要手动删除记录还是自动删除?
【发布时间】:2015-05-18 11:27:59
【问题描述】:

我已经实现了 PDO 会话存储(= 会话现在保存在 mysql 数据库表中)。 这是 symfony2 参考:
http://symfony.com/doc/current/cookbook/configuration/pdo_session_storage.html

如果我访问我的 web 应用程序的页面(即使没有登录),我的会话表中会添加 2 条记录。这是正常的吗? (一个用户有 2 条记录)
然后,如果我登录,那 2 条记录将被更改(但没有添加记录)。 最后,如果我注销,这两条记录又会发生变化,但没有任何内容被删除。

如果现在一切都是正确的,如何/何时将过期会话的记录从 db 表中删除?我需要实现一个 cronjob 还是 symfony 会自动实现?

那么,我是否需要做一些事情(= 编写一些特定的代码)?

我发现了这个问题:
Symfony2, Configure pdo session storage in database
垃圾收集器是否负责删除会话表中的记录?默认情况下是否处于活动状态?

【问题讨论】:

    标签: php symfony session pdo


    【解决方案1】:

    默认情况下应该是自动的,但是过期的会话不会在每个请求上被删除,而是根据一些概率(默认是 1% 的机会)。

    \Symfony\Component\HttpFoundation\Session\Storage\Handler\PdoSessionHandler

    public function gc($maxlifetime)
    {
        // delete the session records that have expired
        $sql = "DELETE FROM $this->table WHERE $this->timeCol < :time";
    
        try {
            $stmt = $this->pdo->prepare($sql);
            $stmt->bindValue(':time', time() - $maxlifetime, \PDO::PARAM_INT);
            $stmt->execute();
        } catch (\PDOException $e) {
            throw new \RuntimeException(sprintf('PDOException was thrown when trying to delete expired sessions: %s', $e->getMessage()), 0, $e);
        }
    
        return true;
    }
    

    http://php.net/manual/en/sessionhandlerinterface.gc.php

    您还可以为注销提供程序设置 invalidate_session 密钥。它应该从数据库中销毁会话。

    logout:
        invalidate_session: true
    

    【讨论】:

    猜你喜欢
    • 2015-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多