在PHP SESSION中缓存数据,还是每次从db查询?

时间:2009-09-07 04:45:47

标签: php mysql caching session-variables

对于(A)在$ _SESSION数组中每次加载页面时使用的缓存数据,它是否“更好”(更有效,更快,更安全等)(但仍在查询表中的标志以重新加载数据每次都从数据库加载它?或者(B)从数据库加载它?

我正在使用缓存方法(A),但我担心有数百个用户,内存可能会成为一个问题?它只是简单的数据,如名字,姓氏,生日等。

使用任何一种方法,仍然会运行查询。想法?

2 个答案:

答案 0 :(得分:6)

如果您的数据在每个页面上使用,并且对所有用户都相同,我不会将其缓存在$ _SESSION中(这意味着每个用户都拥有该数据的不同副本),但是还有另一种机制,例如:

  • 文件
  • 在内存中,例如APC(如果只有1台服务器)
  • 在内存中,例如使用memcached(如果您有多个服务器)
  • 如果您的数据需要长时间计算或者需要获取多个数据库查询,那么在数据库中缓存它可能是另一种可能性(意味着只需要一次查询来获取,并且计算量更少)


如果您的数据对于每个用户都不相同(在您的情况下似乎就是这种情况,因为您正在缓存名称,生日,......)

  • 我会确保只缓存必要的内容
  • 一旦你只有一些数据要缓存,把它放在会话中就应该没问题
  • 如果你真的拥有那么多用户,你可能会遇到其他一些可扩展性问题,并且最有可能会使用像memcached这样的东西;这意味着你将有其他一些缓存方式; - )

作为旁注:如果你一遍又一遍地做同样的查询,你的DB服务器应该自己缓存它(对于MySQL,它会进入“query cache”);所以,我认为它不会像你想象的那么糟糕 - 即使没有那么多优化^^

答案 1 :(得分:1)

这取决于你的会话处理程序是什么。您的会话处理程序可能是MySQL,因此问题不是哪个更好,而是如何优化会话处理。

默认的PHP会话处理程序是文件,但可以很容易地将其更改为mysql。

如果您正在谈论非用户特定数据,那么只需将其保存到数据库即可。如果您以后遇到问题,请担心优化。使用更好的设计模式然后考虑事先优化通常更有利。设计代码,以便您可以轻松地使用不同的处理程序进行存储,以后不会有优化问题。

如果它是特定于用户的,请使用会话,但必要时使用适当的会话处理程序。