在什么情况下,将表用于用户会话而不是本机会话更好?

时间:2009-09-22 05:40:31

标签: php database-design

这就是我需要提出的所有问题

我现在正在处理一个网站,我看不到将我的会话存储在数据库表中而没有这样做的真正重要区别。

4 个答案:

答案 0 :(得分:4)

我有时会将会话数据存储在数据库中,这有几个原因。以下是最大的两个:

  1. 共享服务器上的安全问题如果您在共享服务器上运行,则服务器的其他用户可能很容易插入临时目录并且可以访问您存储在那里的会话数据。这不是常见,但可以发生。
  2. 使用多台服务器如果您正在升级并使用多台服务器,则最好将会话数据存储在数据库中。这样,整个服务器堆栈(或服务器场取决于您的工作量)可以轻松获得数据。这也可以通过平面文件系统实现,但使用数据库通常是一种更优雅,更简单的解决方案。
  3. 我唯一能想到的使用数据库只是你要运行的查询数量。对于每个页面加载,您将有一个额外的查询来收集会话数据。但是,一个小的额外查询不应该产生那么大的差异。我在上面概述的两点超过了这个小成本。

    希望有所帮助。

答案 1 :(得分:0)

当您无法控制谁可以访问存储会话文件的目录时,在共享主机上。在这种情况下,在DB中存储会话可以提供更好的安全性。

我自己没有经验的一种情况,但我认为是一个现实的场景:
在负载平衡服务器场上,可以通过多个服务器分派一个用户的后续请求。在这种情况下,您可以选择拥有一个中央数据库服务器。在这种情况下,如果您没有这样的集中式会话存储库,用户的会话数据就会丢失,因为他们可以根据请求切换服务器。

答案 2 :(得分:0)

当您使用多个服务器时,存在巨大差异,其负载平衡机制并不能保证给定的使用将始终发送到同一服务器:

  • 使用基于文件的会话,如果用户负载均衡到与服务于前一页的服务器不同的服务器,则将找不到包含其会话的文件(因为它在另一台服务器上),并且他不会有他的会话数据
  • 使用基于数据库的或基于memcached的会话,会话数据可以从任何服务器获得 - 实际上非常好,在这种情况下。

当您使用某些共享主机时也有区别:使用基于文件的会话,如果这些位于服务器的“temporaty”目录中(如/ tmp),任何人都可能会读取您的会话文件,具体取决于服务器的配置。使用基于数据库的会话时,此问题不存在,因为每个用户将拥有不同的DB和DB用户。

答案 3 :(得分:0)

除上述帖子外:

  • 数据库会话(当会话表是内存类型时)更快。
  • 使用基于文件的会话时,会话文件被锁定,直到脚本结束。因此,用户不能在服务器上同时使用两个脚本。例如,当您编写下载服务器时,这很重要。用户下载文件,脚本将文件发送给他,使会话文件保持锁定状态。并且用户不能同时浏览文件存档的内容。