会话重载 - PHP 会话中存储的“数据过多”是啥?

Posted

技术标签:

【中文标题】会话重载 - PHP 会话中存储的“数据过多”是啥?【英文标题】:Session overload - what is "too much data" stored in a session in PHP?会话重载 - PHP 会话中存储的“数据过多”是什么? 【发布时间】:2011-01-13 22:01:59 【问题描述】:

我正在使用会话数组来缓存从数据库中检索到的信息块:

$result = mysql_query('select * from table');
array_push($_SESSION['data'],new Data(mysql_fetch_assoc($result)));

我的问题是,在会话中可以/应该传递的信息是否有限制/大量?这样做是不明智的还是严重阻碍了性能?

【问题讨论】:

只检查是否使用数据库存储进行会话检查列的数据类型和长度 【参考方案1】:

默认情况下,$_SESSION 数据存储在服务器的 /tmp 目录中的磁盘上。只要你有足够的空间并且你没有达到你的 php 内存限制,你就可以了。

但是,如果您尝试为大量用户缓存相同的查询,您可能希望使用不与单个用户绑定的 APC 或 memcache 之类的东西。否则,您实际上将为每个用户缓存相同的结果 1x,而不是在所有用户中利用缓存。

【讨论】:

【参考方案2】:

我认为答案取决于您将数据存储在哪里以及在那里传输数据的速度。

如果数据是 44 MB 大,并且您在 1000base-T 网络上,您可以预计实际传输需要 1 秒。还有 1 秒转回来..

如果你使用本地内存,那么你的机器内存是有限的。

如果你使用磁盘,那么你有加载/保存时间(磁盘很慢)。

但请记住,PHP 的内存量是有限的,它允许脚本使用。我认为默认设置是 8 MB。

如果您谈论的是大块数据,您可能需要考虑Redis、Tokyo Cabinet 或其他键/值存储。甚至是一个后端接口来为您操作数据/缓存它,而无需通过 PHP 传输。

【讨论】:

【参考方案3】:

因为会话数据存储在服务器上的文件(或数据库记录)中,所以在其中存储多少数据并不重要。我只是建议不要使用大型物体。

您可能希望查看 APC 或 memcached 来缓存结果,因为它不是每个用户的缓存,它使用内存而不是文件。

【讨论】:

【参考方案4】:

默认情况下会话被序列化并写入磁盘,因此根据大小和用户数量,事情可能会变慢。然而,这两件事都可以更改(阅读http://php.net/session 下的会话手册了解所有详细信息),例如使用内存缓存在内存中存储数据。最好的办法是在尽可能类似于实时系统的环境下进行尝试,并检查产生的负载和吞吐量。

【讨论】:

【参考方案5】:

嗯,很棘手。我认为您可以将其保存在会话中。真正的问题是:您是否希望每次客户端发出请求时都对所有信息进行序列化和反序列化? 如果您将在网站的每个页面中使用所有这些信息,我认为将其保存在那里是可以的,但这是不可能的。如果您将该信息保存在像/temptables/sometable/ 这样的目录中并且每个文件都有会话的名称,那会更好。您可以使用session_id 获取它,并将信息保存并加载到您必须使用的页面中:

$info = unserialize(file_get_contents('/templatebles/sometable/'.session_id().'.ser'));

并保存:

file_put_contents('/temptables/sometable/'.session_id().'.ser'), serialize($info));

但是您需要一个cron 作业来清理该目录中的旧文件。您可以从文件名中获取会话并请求一些变量,例如“itsalive”,使用session_start() 或执行file_exists(session_save_path().'/sess_'.$session_name) 之类的操作来检查是否应该删除临时文件。

【讨论】:

以上是关于会话重载 - PHP 会话中存储的“数据过多”是啥?的主要内容,如果未能解决你的问题,请参考以下文章

PHP 中会话名称的限制是啥?

Chrome 开发者工具中的“会话存储”是啥?

PHP会话的风险是啥?

在 Keycloak 集群的 Infinispan 缓存中存储用户会话的确切用途是啥?

PHP存储会话数据,在会话中存储用户ID

如何在 APC 缓存中存储 PHP 会话?