会话过载 - PHP中的会话中存储的“太多数据”是什么?

时间:2010-02-06 18:00:41

标签: php mysql session caching

我正在使用会话数组来缓存从db:

中检索到的信息块
$result = mysql_query('select * from table');
array_push($_SESSION['data'],new Data(mysql_fetch_assoc($result)));

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

5 个答案:

答案 0 :(得分:6)

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

但是,如果您尝试为大量用户缓存SAME查询,则可能需要使用与单个用户无关的APC或memcache。否则,您实际上将为每个用户缓存相同的结果1x,而不是在所有用户之间利用缓存。

答案 1 :(得分:1)

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

如果数据大小为44 MB,并且您位于1000base-T网络上,则可能需要1秒才能实际转移THERE。还有1秒转回......

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

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

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

如果您正在讨论大量数据,您可能需要考虑RedisTokyo Cabinet或其他键/值存储。甚至是后端界面来操纵数据/缓存它而不通过PHP传输它。

答案 2 :(得分:0)

由于会话数据存储在服务器上的文件(或数据库记录)中,因此存储在其中的数据量应该无关紧要。我只是建议反对巨大的物体。

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

嗯,狡猾。我想你可以把它保存在会话中。真正的问题是:每次客户端发出请求时,您是否希望所有信息都序列化并反序列化? 如果您将在网站的每个页面中使用所有信息,我认为可以将其保存在那里,但这是不可能的。如果将该信息保存在/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作业来清除旧文件的目录。您可以从文件名中获取会话并使用session_start()file_exists(session_save_path().'/sess_'.$session_name)之类的内容请求某个变量,例如'itsalive',以检查是否应删除临时文件。