会话变量:多少数据太多了?

use*_*360 30 php mysql session-variables

我只看到了用于存储少量数据的会话变量的示例,例如单个用户ID.我想知道在会话变量中保持更频繁访问的数据是否更有效,以避免查询数据库.

例如,我创建了一个用户类,它在构建时为该用户收集定期请求的数据(他们的用户ID,用户名,电子邮件,密码和站点特定数据的数组),并将此实例保存为会话变量.在用户初始登录后,很少需要查询数据库以获取有关用户的信息,因为它已经在内存中.

我实际上是否更高效,或者我只是在内存使用情况下陷入困境?

旁注 - 我实际上发现从会话中获取数据更容易,而不必担心优化我的查询和内容,所以我真的希望我不是白痴.

nic*_*har 32

首先,PHP会话默认不存储在内存中,它们存储在磁盘上,因此您写入的每个块/会话将占用磁盘空间而不占用内存(直到您使用PHP读取会话数据).

是的,你可能会更有效率,但如果你想扩展则不是,这就是原因:


在会话中存储数据

在会话中存储一些数据是完全可以接受的.从理论上讲,没有限制(虽然我从来没有试图打破它甚至推动它,只是转向更有效的解决方案).但是,您将受到磁盘空间和PHP的限制memory_limit().

通常,会话中存储的数据包括以下内容:

  • 用户名
  • 哈希
  • 注册日期
  • 其他变量(用户组ID /键等)
  • Flash消息
  • (不是密码!)

但是,有一个权衡.如果您的流量(和使用量)增加并且您正在存储大量数据$_SESSION,则很可能会在磁盘和内存使用方面开始出现问题.

我不认为您的建议存在任何问题,但除了您列出的项目以及上述示例重叠之外,还需要注意.

如果要扩展(水平)并保留基于磁盘的会话,则可以选择(粘性会话或存储区域网络是一对),因为一台服务器上的磁盘不会将另一台服务器上的磁盘存储为相同的会话.


会话数据位置

您可以通过调用以下命令找到PHP存储会话数据的位置: session_save_path()

或在CLI上:

php -r 'echo session_save_path(), "\n";'
Run Code Online (Sandbox Code Playgroud)

您没有提到您的操作系统,但会话文件的常见位置(跨不同的操作系统类型)是:

/tmp 
/var/lib/php5/
/var/lib/php/session
c:/wamp/tmp
Run Code Online (Sandbox Code Playgroud)

存储在磁盘上的会话通常具有如下所示的文件名ls -al:

-rw-------  1 www www      0 2013-07-09 20:12 sess_bdsdjedmvtas5njhr5530b8rq6
Run Code Online (Sandbox Code Playgroud)

值得注意的是,通常会有垃圾收集过程在特定时期后清除死会话.它确实因操作系统而异,但它们通常存在于各种基于LAMP的安装中.


其他会话存储选项/方法

在您的数据库中,
会话数据通常存储在数据库中而不是存储在本地磁盘上,这适用于微型,小型和(取决于它是如何完成的)具有合理流量级别的中型站点.

像任何其他解决方案一样,它拥有它的专业和控制(就像能够通过运行查询而不是从中删除会话文件来禁止/踢出用户/tmp)

在内存中,
对于较大的(较高流量)站点,特别是并发用户量较高的站点,对于非常频繁访问的变量或数据,内存可以更快地读取/写入,而不是为数据库添加过度负载.它可以并且仍然应该写入DB(参见直写缓存),但也可以保存在内存中以便进行有效访问.

一种特殊优点的技术是内存缓存.一个广泛使用的示例PHP兼容的开源解决方案是Memcached,它可以在一个服务器上使用,也可以在许多[分布式]上使用.我已经看到小公司和大公司都使用这个,你只需要看看谁使用它/贡献...

  • @and-bri 因为在会话劫持的最坏情况下,你就完蛋了! (2认同)

Mar*_*hio 5

这一切都取决于服务器资源,以及您的网站/应用程序的同时用户.

您可以通过估计每个用户将需要的平均会话内存,将其乘以平均同时访问者数量,并将其与服务器中可用于PHP的内存进行比较来进行粗略计算.

此计算将帮助您以非常粗略但有用的方式估算场景中的过多量.

编辑:按内存我的意思是RAM和/或磁盘空间,具体取决于您的设置.