会话变量是否有限制?

55

就像标题所说,会话变量是否存在限制(如果有)?它们是否被视为“普通”变量并且可以存储相同数量的数据?

我正在寻找除最大长度、最大值等变量类型限制以外的任何其他限制。

P.S. 如果问题不清楚,请告诉我。

提前感谢!

4个回答

54

正如@Thariama所说,变量数量没有限制; 此外,您可以在会话中存储的数据量也没有限制(我见过大小为数十MB的会话)。

随着会话大小的增加,您会遇到各种怪异问题:PHP 5将整个会话反序列化到内存中的session_start()(使用默认会话处理程序 - 当然,您可以自己创建解决方案); 对于20 MB的会话和50个并发用户,脚本开始受到磁盘访问速度的严重限制(也称为“脚本启动缓慢”-仅会话就会占用1GB RAM);最终,我们专门为保持尽可能多的会话而分配了一个盒子,前端盒子通过NFS访问它们(虽然这对我们有所帮助,但对您来说可能过度了)。

请注意,对于许多并发用户和会话存储在磁盘上的情况,会话临时文件的数量可能会导致文件系统限制(例如,在运行stat()性能之前,一个目录中可以有多少个文件),或其他限制(我们曾经发现过一台机器配置成一次只允许打开4096个文件)。所有这些都不是真正会话特定的,但可能由会话处理引发。


15

不,会话所占用的空间没有上限(或者一个会话可以拥有多少个变量没有限制)。

唯一的限制是您计算机的规格,这由php.ini配置文件中可用的memory_limit定义。

请注意,这个空间将被所有用户的所有会话共享。


问题不在于我可以拥有多少个会话变量,而是每个变量可以存储多少数据。 - tomsseisums

8

这完全取决于您的Web服务器。对于Apache,请查看此处:

http://httpd.apache.org/docs/trunk/mod/mod_session.html

它甚至可以通过使用mod_session_dbd将会话存储在数据库中。因此,可以克服每个会话一个文件的物理限制。此外,Apache可以配置为跟踪存储在特定服务器或一组服务器上的每个用户会话,以实现可扩展性。

你可以在PHP中编写自己的会话处理程序来实现这一点 - 虽然编译的模块可能更有效。 - Piskvor left the building
5
如果投票者没有留下评论,即使您问他们,他们也可能不会留下评论。对于单个的负评,不用担心——这只是一个无知/随意/匆忙的投票者。 - Piskvor left the building
目前是+2/-1;我们能否将有关SO运作的讨论转移到http://meta.stackoverflow.com?那里有很多有用的投票答案。 - Piskvor left the building
因为我们正在讨论PHP会话,所以被踩了。这个Apache模块与PHP完全无关。 - user2629998

3
简单的答案是否定的。(也就是说,它们没有比任何其他PHP变量更多的限制...必须适合内存等。) 但是,请记住,默认情况下,$_SESSION数据存储在某个地方,通常是作为每个会话中序列化数据的一个文件。因此,存在实际限制。您不希望在其中存储大量信息,因为它们将在使用session_start()的每个页面上从数据存储加载/保存。

模板数据可以被视为“巨大的 blob”吗?更准确地说,我的模板数据是通过 file_get_contents(); 从 HTML 文件中获取的。大多数情况下,它不会超过几 KB,但在将来,我可能需要在此会话变量中加载更大的模板。 - tomsseisums
我的主要观点是$_SESSION数据不是免费的。您放入其中的所有内容都将在每个页面视图上加载,即使您不使用它。如果您需要在每个页面视图上访问该模板数据(因此以某种形式加载到内存中),那么它来自会话还是其他地方并不重要。我个人不会使用会话来处理这种类型的数据,但这只是我的看法。 - Matthew
@Tom:不要那样做。我已经看到过了,这样做会导致疯狂。会话用于存储需要快速访问的临时数据;模板并不是真正的临时数据(是的,在这种情况下,我认为它们是“一个巨大的块”)。考虑一些其他的缓存机制来处理你的模板,但不要把它们放进 $_SESSION 中。 - Piskvor left the building
但是,将某些东西保留在会话中(例如用户信息数组)而不是重新从数据库查询是否更好? - Zeke Nierenberg
@Zeke,“更好”是主观的,特别是没有细节。但一般来说,通过像memcached这样的东西实现适当的缓存层比使用会话作为贫民窟缓存更可取。 - Matthew
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接