微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

php – 为什么Symfony在每个请求上从数据库重新加载用户?

从Symfony 2食谱: Understanding serialize and how a User is Saved in the Session

Once the user is logged in,the entire User object is serialized into
the session. On the next request,the User object is deserialized.
Then,value of the id property is used to re-query for a fresh User
object from the database
.

和,

… in practice,this means that the User object is reloaded from the
database on each request
using the id from the serialized object.

为什么Symfony有必要从每个请求的数据库获取User对象?

存储在会话数据中的序列化用户对象在什么情况下与从数据库提取用户对象不匹配?当然,Symfony知道用户对象何时发生变化,并且可以在这种情况下简单地更新会话数据?

我想象这是一个很好的理由,因为在每个请求上不必要地查询数据库是浪费的.

免责声明:我不熟悉Symfony,所以这是从一般PHP知识和几个假设写的.

PHP会话通常不受外部操作 – 它们只是文件或内存存储中的一系列数据.改变一个的唯一方法是反序列化,改变和保留整个事情 – 这通常只有在你进入该会话时才会完成.

因此,如果用户的详细信息在登录会话之外更改,则序列化的Blob将保持不合时宜.这将是一个特殊的问题,例如,如果管理员撤销了用户的访问权限.

诸如memcached的缓存可能会存储每个用户的详细信息,并在编辑时明确刷新/更改,但这将被视为数据库提取的一部分(memcached层作为更快地访问数据库数据),而不是会话处理.

正如haltabush在评论中提到的那样:如果用户在每个请求中被提取,为什么要序列化它呢?

答案是足够的信息需要存储在会话中,以确定哪个用户登录,并在下一页的加载中获取它们的全部细节.这可以像存储用户ID一样简单,但是通过使用Serializable接口,Symfony可以将其放在特定实现中,以确定哪些字段应该保存到会话中,哪些字段应该被重新获取反序列化.

它还打开了一个实现选项,将用户的所有细节保存到会话中,并以更轻松的方式“刷新”,例如.经过一定的时间或数量的请求,如this related question所讨论的.

原文地址:https://www.jb51.cc/php/132957.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐