【问题标题】:Symfony: Warning: session_start(): Failed to decode session object. Session has been destroyedSymfony:警告:session_start():无法解码会话对象。会话已被销毁
【发布时间】:2020-09-25 00:14:32
【问题描述】:

当我尝试使用_switch_user 切换用户(模拟)时,Symfony 给了我一个错误。它可能在更改会话表名称后开始发生。其他一切正常(在不模拟的情况下从会话中设置和获取数据)。

警告:session_start():解码会话对象失败。会话已被销毁

来自日志的精确错误

[2020-05-21 11:28:37] php.WARNING:警告:session_start():无法解码会话对象。会话已被销毁 {"exception":"[object] (ErrorException(code: 0): Warning: session_start(): 无法解码会话对象。会话已在 /app/my_app/vendor/symfony/http-foundation 销毁/Session/Storage/NativeSessionStorage.php:151)"} []

触发错误的精确行 (\src\EventListener\MyListener.php)

public function onKernelRequest(RequestEvent $event) {
   $request = $event->getRequest();
   $request->getSession()->set('hash', $_ENV['HASH']);
}

我的会话处理程序配置 (config\services.yml)

Symfony\Component\HttpFoundation\Session\Storage\Handler\PdoSessionHandler:
        public: false
        arguments:
            - 'mysql:host=%env(DATABASE_HOST)%;dbname=%env(DATABASE_NAME)%'
            - { db_table: 'my_sessions', db_username: '%env(DATABASE_USER)%', db_password: '%env(DATABASE_PASSWORD)%', lock_mode: 0 }

我的会话配置 (config\packages\framework.yml)

session:
        handler_id: Symfony\Component\HttpFoundation\Session\Storage\Handler\PdoSessionHandler
        cookie_samesite: 'none'
        cookie_secure: true
        cookie_httponly: true
        gc_probability: 0

我正在使用

  • Symfony 4.4.2
  • PHP 7.2
  • “friendsofsymfony/user-bundle”:“2.1.2”

【问题讨论】:

    标签: php symfony session


    【解决方案1】:

    我想我今天遇到了和你一样的问题。我正在使用 Symfony 5,但 Symfony 4 也是如此。问题是因为我的 User 有一个 ManytoMany 关系,在某些情况下,包含所有子实体的完整对象被序列化并存储在会话中。在PdoSessionHandler 上,数据存储在BLOB 字段中,该字段限制为64Kb,我的序列化对象超过100Kb!

    验证步骤

    当您的页面在开发模式下崩溃时,它会在您发布后重定向。转到左下角的调试栏,那里写着500,然后打开菜单。你应该看到:Redirect from POST @route (profile)profile 是一个链接,因此请点击它。在分析器中继续请求/响应 > ** session **。您应该在 Session Attributes 中看到一个以 _security_ 开头的键和您的防火墙的名称(我的是 admin,所以它是 _security_admin )。在那里你应该看到存储的数据,如果超过 64K,就是这样!

    修复步骤

    您必须在您的用户实体中实现Serializable 接口,如下所述:https://symfony.com/doc/4.0/security/entity_provider.html(这也适用于 SF 5)。这将使序列化的对象更轻!

    小心

    更改序列化可能会影响您网站中的其他功能,因此请注意副作用。另外我遇到了一个问题,因为我有一个自定义的getUsername(),并且此方法用于用户验证,所以请注意您的自定义方法可能会对用户验证产生影响!

    【讨论】:

    • 这救了我!!谢谢
    • 呸,好难找,谢谢!!
    猜你喜欢
    • 1970-01-01
    • 2013-06-26
    • 2017-08-29
    • 1970-01-01
    • 2019-07-30
    • 2016-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多