Symfony2 - PDO会话 - 我是否需要手动删除记录或一切都是自动的?

时间:2015-03-16 11:06:43

标签: php symfony session pdo

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

如果我访问我的webapp页面(即使没有登录),我的会话表中会添加2条记录。这是正常的吗? (2个用户记录)
然后,如果我登录,则更改这两个记录(但不添加记录)。 最后,如果我退出,则2条记录会再次更改,但不会删除任何内容。

如果现在所有单元都正确,那么将从db表中删除过期会话的记录的时间/时间?我需要实现一个cronjob还是symfony会自动执行此操作?

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

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

1 个答案:

答案 0 :(得分:4)

默认情况下应该是自动的,但是每次请求都不会删除过期的会话,而是根据某种可能性删除(默认值为1%)。

<强> \的Symfony \元器件\ HttpFoundation \会话\存储\处理程序\ 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