2014-09-29 173 views
3

对于我的登录系统,我需要检索一些用户数据,范围从用户名到会话&'禁止状态',用于检查用户是否被暂停。PHP登录 - 从数据库获取用户数据或存储在会话中?

我见过一些系统从每个负载上的users中检索这些数据。我的问题是:这是否被视为对我的服务器不必要的压力?

或者我应该只将这些数据存储在我的$ _SESSION中?但它不会被更新,我不知道如何检查禁止状态。

谢谢!

+0

许多站点会检查每个页面加载的详细信息 – 2014-09-29 02:38:51

回答

2

用于检索每个请求上的用户信息的单个数据库查询应该没问题 - 它速度非常快,并且在服务器上没有太大影响。您可以随后在缓存中添加缓存(例如,APC或memcached),让缓存每10分钟过期一次,或者经常需要检查用户是否被禁用。但是我不会为此烦恼,除非你的网站获得了很多流量,而你实际上注意到了性能问题(换句话说,请避免premature optimization)。

编辑: 如果更改用户的禁止状态总是通过您的应用程序发生的,而不是直接在数据库中,那么你可以设置一些代码,当用户被禁止清除缓存运行。这样在禁令生效之前不会有10分钟的延迟(或缓存过期时间)。但正如我上面所说,你可能不需要首先打扰缓存。

+0

从用户的角度来看,将会话数据存储在memcache等中并不总是最好的想法。想象一下,每次缓存充满或开发人员进行热部署并清除它时,都会注销:D但是这些都是特定于应用程序的。 – ZorleQ 2014-09-29 03:33:32

+0

我并不是建议将会话数据存储在缓存中,而只是将数据库中的数据存储在缓存中,这样您就不必在每个请求中查询数据库。无论缓存清除多少次,登录用户的ID和其他会话数据的ID都可以一直保留在会话中。 – 2014-09-29 04:42:53

2

这取决于

用户名例如 是不必要的始终查询数据库来获取用户的用户名,因为多久很可能用户改变他/她的用户名?因此,当用户登录时,最好将它存储在会话变量中

如果事实上,当用户确实更改了他/她的用户名,那么在这种情况下,当用户更改他的用户名时,可以更新用户的会话变量:

function changeUsername($username){ 
    $userId = $_SESSION['user']['id']; 

    //Code to change username 

    updateUserSession($userId); 
} 

function updateUserSession($userId){ 
    //Query new username and other information 
    $_SESSION['user'] = $dataFromQuery 
} 

潘基状态示例 如果你有一个功能,它允许您禁止用户。您仍然可以使用会话变量。这次在你的代码中唯一的区别是,当你禁止用户时,你将不得不清除并重新填充会话变量以用新信息更新它。然而,这样做可能有点棘手,因为禁止的人与被禁止的人不同,因此访问用户的会话变量是棘手的并且需要解决方法

因此,更好的方法来做到这一点你是否必须重复检查每个页面请求的禁止状态?但是,对每个页面请求执行查询并不是一件坏事。事实上很多网站都会做数百个查询。但是请注意,获取所有信息的一个大查询比获得相同数量信息的一百个小查询要好。

所以这一切都取决于你,使用会话变量的用户名和禁止状态示例显然是过度杀手,但我反正说这是为了说明如果他们想要如何做。没有任何错误,事实上,这是推荐用于流量高的站点,因为在会话变量中存储值的形式为caching。还有其他方法可以缓存数据,但这是其中的一种方式

+0

我同意,如果您只需要知道用户名,将其存储在会话变量中会更好。但是为了检查被禁止的状态,正如你所说在会话中存储它会很棘手,而且我认为没有这样做的好处。只需通过APC或memcached中的用户标识查找用户数据就简单多了。但是,是的,在某些情况下会话也可以用于缓存(用户名就是一个很好的例子)。 – 2014-09-29 04:53:58

相关问题