【发布时间】:2011-12-31 08:57:30
【问题描述】:
谁能解释在会话中存储大量数据的缺点或指向我阅读?
如果在会话中存储数据和从数据文件中读取数据之间有什么区别,我也会感兴趣?
【问题讨论】:
-
你来过这里。请停止在您的帖子上签名(并且您的标题应该描述问题,而不是列出技术和主题)
谁能解释在会话中存储大量数据的缺点或指向我阅读?
如果在会话中存储数据和从数据文件中读取数据之间有什么区别,我也会感兴趣?
【问题讨论】:
如果您在会话中存储大量数据,您的输入/输出性能将会下降,因为将会有大量的读/写操作。
默认情况下,PHP 中的会话存储在平面文件的 /tmp 目录中。因此,您的会话数据被写入某种数据文件中。
PHP 允许您通过 session_set_save_handler() 函数覆盖其默认会话处理程序,您可以在其中重新定义读取/写入/维护会话的方式。
您也可以通过 php.ini 文件覆盖它,您可以通过 session.save_handler 指令指定它。
现在,使用大量会话存储大量数据的含义是,将创建大量文件,并且由于硬盘驱动器的运行方式(当然是机械的,它们是常见的仍然)。 你拥有的越多,找到它所需的时间就越长。它们越大,阅读它所需的时间就越长。如果您有很多并且它们很大 - 麻烦加倍,则需要改变方法。
那么解决办法是什么?
通常,当遇到性能下降时,人们会对其网站进行负载平衡。不幸的是,这不适用于会话,因为负载平衡正在选择使用哪台计算机来服务当前请求。这意味着不同的计算机将为您在某些网站上浏览的页面提供服务。这意味着,如果这些计算机使用默认的会话存储机制(/tmp 目录),则不会在服务器之间保留会话,因为它们无法访问彼此的 /tmp 目录。 您可以通过安装 NAS 并使其对集群中的所有计算机全局可见来解决此问题,但这既昂贵又难以维护。
另一种选择是将会话存储在数据库中。可以从我们虚构集群中的任何计算机访问数据库。通常,有专门用于处理会话的数据库,专门用于与存储您的网站内容或其他内容的数据库分开。 在 NoSQL 流行的时代——在我看来,NoSQL 非常适合处理会话。它们易于扩展,将数据写入存储设备的速度比 RDBMS 快。
第三种选择是提升所有这些,放弃硬盘作为永久存储解决方案,只使用服务器的内存进行会话存储。 您得到的是令人难以置信的性能,但是您的所有 RAM 可能很快就会消失。 您还可以创建一个计算机集群,将会话存储在其 RAM 中。 Redis 和 Memcache 非常适合这项任务,谷歌搜索一下将为您提供很好的资源来解释如何使用 Redis 或 Memcache 来存储会话。
所有这一切的底线是:不要在会话中存储太多数据。 根据您的需求和预算 - 有 3 种可供选择的方式来存储和使用会话。
【讨论】:
这是一个很好的链接:http://tuxradar.com/practicalphp/10/1/0
会话数据也是非常昂贵的工作负载。最好的方法是存储一个 cookie 或 session_id 并使用它从 dbfile/rdbms 中查找您需要的内容。这还允许您的网站在多服务器环境中运行,因为会话数据仅限于一个。
【讨论】: