我正在使用会话数组来缓存从db:
中检索到的信息块$result = mysql_query('select * from table');
array_push($_SESSION['data'],new Data(mysql_fetch_assoc($result)));
我的问题是,是否存在可以/应该在会话中传递的限制/大量信息?这样做是不明智的还是显着的性能阻碍?
答案 0 :(得分:6)
默认情况下,$ _SESSION数据存储在服务器的/ tmp目录中的磁盘上。只要你有足够的空间并且没有达到你的PHP内存限制,你就可以了。
但是,如果您尝试为大量用户缓存SAME查询,则可能需要使用与单个用户无关的APC或memcache。否则,您实际上将为每个用户缓存相同的结果1x,而不是在所有用户之间利用缓存。
答案 1 :(得分:1)
我认为答案取决于您存储数据的位置以及将数据传输到那里的速度。
如果数据大小为44 MB,并且您位于1000base-T网络上,则可能需要1秒才能实际转移THERE。还有1秒转回......
如果您使用本地内存,那么您的机器内存有限。
如果你使用磁盘,那么你有加载/保存时间(磁盘很慢)。
但请记住,PHP有一个允许脚本使用的有限内存量。我认为默认设置是8 MB。
如果您正在讨论大量数据,您可能需要考虑Redis,Tokyo 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',以检查是否应删除临时文件。