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

时间:2015-03-03 10:58:46

标签: symfony doctrine fosuserbundle

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

1 个答案:

答案 0 :(得分:3)

首先,sql数据库可以很好地自动缓存查询。因此,虽然在编写和向服务器发送查询时会有一些开销,但服务器本身会很快响应。你不会节省太多额外的缓存。

你还应该尝试优化吗?在每秒10个请求的示例中,假设请求实际上除了获取用户之外还在执行某些操作。由您来决定缓存查询是否会实际加快速度。在大多数情况下,答案是否定的。试图保存每一个可能的微秒称为过早优化,这是值得避免的。

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

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

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

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

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