在临时数据方面,将数据存储在Session中还是Sql数据库中?

11
我想知道哪种方式更有效,是使用PHP中的$_SESSION变量将临时数据(与该会话相关)存储在会话中,还是从SQL数据库中存储和检索?
谢谢您的时间。
5个回答

21

请记住,会话变量是由存储机制支持的,也就是说,在请求完成后,会话处理程序会将会话写入文件中(默认情况下)。在下一个请求中,它会从文件(或其他会话处理程序使用的地方)中获取会话。

如果您每个请求都要读写这些数据,只需使用 $_SESSION 变量即可。连接、查询和更新数据库的开销不会比默认的 $_SESSION 更快。

当您运行多个负载均衡服务器并需要在它们之间共享会话数据时,您可能只需要使用基于数据库的会话。在这种情况下,如果您发现数据库会话的开销明显减慢了网站的速度,您可以考虑在 Web 服务器和数据库之间使用 memcached。


3
我不太了解从数据库或文件中读取数据,但我不认为“DB访问比其他方式慢”是正确的。我在学校课程中学到,与I/O访问相比,网络延迟是可以忽略不计的。如果我们使用DB来进行会话,我们有一些优势:
我们不必担心因为没有文件系统而需要许多服务器。
我认为将某些东西存储/读取到数据库中比文件系统更容易。
此外,如果我们使用共享主机,将会话存储在数据库中对于安全性来说是一个重大优势。
如果我错了,请指正我。我还有很多东西要学习。谢谢。

2

这取决于您想要存储的数据量和处理的流量大小。如果数据很少且网站不需要超出一个Web服务器的规模,那么请使用默认会话处理程序,将会话数据写入Web服务器的文件系统中。

如果您需要扩展到多台服务器,则建议将会话数据存储到内存数据库(例如memcached)或常规数据库中。您可以通过覆盖PHP的会话处理程序并编写自己的实现来在使用$_SESSION时将其存储到数据库中。


1

效率更高的方式取决于您要存储的数据量以及您计划如何处理临时数据。我有时会将5兆字节的会话数据存储在文件存储中,这会极大地影响性能。但是,5兆字节的状态是非常多的,你真的不应该达到那个程度。

无论如何,您可以配置PHP的会话存储在数据库表中,同时获得两种方式的最佳结果。

不过,如果数据并不适合作为用户会话的特征,则不应使用会话,而应使用某些模型对象。


我认为5MB和会话数据意味着某些地方出了问题。 :) - Toby Allen

0

PHP会话比数据库访问更快。但是PHP会话存在一些已知问题

如果您想要真正快速的访问时间,同时避免PHP会话管理的陷阱,您可能需要考虑使用memcached。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接