从Symfony 2 cookbook:了解序列化以及如何在会话中保存用户:
用户登录后,整个User对象将序列化到会话中.在下一个请求中,反序列化User对象.然后,id属性的值用于从数据库中重新查询新的User对象.
和,
...实际上,这意味着使用序列化对象的id 在每个请求上从数据库重新加载 User 对象.
为什么Symfony需要在每个请求中从数据库中获取User对象?
在什么情况下,存储在会话数据中的序列化User对象与从数据库中获取的User对象不匹配?当然,Symfony知道User对象何时发生变化,并且只有在发生这种情况时才能更新会话数据?
我想这是有充分理由的,因为在每个请求上不必要地查询数据库是浪费的.
IMS*_*SoP 13
免责声明:我不具体了解Symfony,因此这是从一般的PHP知识和一些假设中编写的.
PHP会话通常不能从外部操作 - 它们只是文件或内存存储中的序列化数据块.改变一种方法的唯一方法是对其进行反序列化,进行更改,并对整个事物进行重新序列化 - 这通常仅在您进入该会话时才会完成.
因此,如果用户的详细信息在登录会话之外更改,则序列化blob将保持过期.这将是一个特殊问题,例如,如果管理员撤销了用户的访问权限.
诸如memcached之类的缓存可能存储每个用户的详细信息,并在编辑时显式刷新/更改,但这将被视为数据库提取的一部分(memcached层充当对数据库数据的更快访问),而不是会话处理.
正如haltabush在评论中所说:如果每个请求都提取用户,为什么要对其进行序列化?
答案是需要在会话中存储足够的信息以识别登录的用户,并在下一页加载时获取其完整详细信息.这可以像存储用户ID一样简单,但是通过使用Serializable接口,Symfony可以将其留给特定的实现来决定哪些字段应该保存到会话中,哪些字段应该在反序列化时重新获取.
它还保留了实现的选项,以将用户的所有细节保存到会话中,并且在更宽松的基础上"刷新",例如在设定的时间或请求数量之后,如在该相关问题上所讨论的.
| 归档时间: |
|
| 查看次数: |
1573 次 |
| 最近记录: |