我有一个 Symfony 应用程序,它填充了门户应用程序的“小部件”,我注意到一些(看起来)奇怪的事情。门户应用程序具有调用 Symfony 应用程序的 iframe。在每次调用中,都会在查询字符串上传递随机用户 key 。 Symfony 应用程序使用 myUser->setAttribute() 存储该 key 其 session 。如果传入的值与 session 中的值不同,则会覆盖 session 值。
在伪代码中(为了清楚起见,应用同步性质,即使它可能不存在):
# Widget request arrives with ?foo=bar
if the user attribute 'foo' does not equal 'bar'
overwrite the user attribute 'foo' with 'bar'
end
我注意到,在具有多个小部件的门户页面上(阅读:多个请求或多或少同时传入),其中的值需要被覆盖,每个请求都试图覆盖。这是时间问题吗?当我查看日志打印时,我希望到达的第一个请求会覆盖,后续请求会看到它们收到的用户属性与初始请求刚刚放入缓存的内容相匹配。
在这种情况下,后续请求可能会在第一个请求(应该覆盖缓存值的请求)完全完成之前就开始(并被检查)。在一个请求完全完成之前, session 值是否真正可用于后续请求,或者是否可能还缺少其他内容?
谢谢。
最佳答案
直到请求结束(在 sfUser::shutdown
中),用户的属性才会写入存储。属性在请求开始时加载到 sfUser 中。因此,在这种情况下,必须在第一个请求完成后才发起第二个请求。您最好的选择可能是
- 向sfUser添加hardRead和hardWrite方法(看看
sfUser::initialize
和sfUser::shutdown
分别做了什么)。 - 使用另一种存储信息的方法来更好地支持并发。您正在使用的数据库或可能的缓存系统可以工作。例如,我认为这可以使用 APC 缓存来完成。
请注意,根据您用于存储的类,用户属性可能根本不会写入 $_SESSION。 Symfony 支持使用多种方法来存储用户属性(例如数据库、缓存)。
关于symfony1 - Symfony 的用户属性何时写入 session ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3054061/