在会话cookie中存储大量数据有什么影响?

时间:2011-11-17 13:47:31

标签: php session dataset

任何人都可以解释在会话中存储大量数据的缺点或指向一些阅读吗?

如果在会话中存储数据和从数据文件中读取数据之间存在任何差异,我也会感兴趣吗?

2 个答案:

答案 0 :(得分:4)

如果在会话中存储大量数据,则会导致输入/输出性能下降,因为会有大量的读/写。

默认情况下,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个选项可用于存储和使用会话。

答案 1 :(得分:1)

这是一个很好的链接:http://tuxradar.com/practicalphp/10/1/0

会话数据也是非常昂贵的工作量。执行此操作的最佳方法是存储cookie或session_id,并使用它来从dbfile / rdbms中查找所需内容。这也允许您的站点在多服务器环境中运行,而会话数据仅限于一个。