我可以而且应该缓存 symfony2 getUser()

Can and Should I cache symfony2 getUser()

每当我想检查用户是否登录时,我都在使用 Symfony(当前版本 2.6.4)(我也在使用 FOSUserBundle)我在我的控制器中使用 $user = $this->getUser(); 效果很好但是如果我在 1 秒内打开 10 个链接,在那一秒内对所有 10 个页面重复此查询,在我的选择中不太理想。所以我的问题是,有没有办法将此查询缓存 60 秒,甚至是否可取,它会影响新注册或其他什么吗?我正在使用 APC 作为我的学说缓存,但如果有人知道答案,请告诉我们如何使用其他方式,以防其他人也想知道如何做到这一点。谢谢

首先,sql 数据库在自动缓存查询方面做得很好。因此,虽然在编写查询并将查询发送到服务器时会产生一些开销,但服务器本身会非常快速地响应。添加另一个缓存不会节省太多。

你还应该尝试优化吗?在每秒 10 个请求的示例中,假设请求实际上在获取用户之外还做了一些事情。由您决定缓存查询是否真的会加快速度。在大多数情况下,答案是否定的。试图节省每一微秒的时间称为过早优化,应该避免。

话虽如此,还是值得看看安全系统在做什么。选定的用户信息存储在会话中。您可以使用调试配置文件栏来查看它。对于每个请求,安全系统将用户拉出会话,然后调用 $user = $userProvider->refreshUser($user);默认情况下,refreshUser 是导致查询数据库的原因。

您可以轻松插入自己的用户提供程序 (http://symfony.com/doc/current/cookbook/security/custom_provider.html),它只是 returns $user。根本没有数据库交互。当然,如果用户的数据库信息确实发生了变化,那么他们将需要注销然后重新登录才能看到变化。或者做其他事情来触发真正的刷新。但是对于很多应用来说,根本不刷新就可以了。

在会话中添加时间戳也很容易。然后,您的 refreshUser 方法可以使用时间戳来决定是否确实需要刷新。

所以很容易消除查询,实际上值得作为一种学习经验。安全性是更复杂的组件之一。你越了解它,你就会过得越好。自定义用户提供者是比较容易做的事情之一。

我刚刚看到您对 OAuthBundle 的评论。我有一段时间没有使用捆绑包了。实现了我自己的,但令我惊讶的是它在每次请求时都会访问 oauth 服务器。如果是,那么这实际上是覆盖用户提供者的一个很好的用例。但如果它真的只是为了用户信息而这样做,我会感到惊讶。