正如标题所说,会话变量是否有限制(如果有的话),或者它们被视为通常的变量并且可以存储相同数量的数据?
我正在寻找除了最大长度,最大值等变量类型之外是否还有其他限制。
附: 如果问题不清楚,请告诉我。
提前致谢!
正如@Thariama所说,变量的数量没有限制;此外,您可以在会话中存储的数据量没有限制(我已经看到会话数十MB)。
随着会话的大小变大,你会遇到各种怪癖:PHP 5将整个会话反序列化为session_start()的内存(使用默认的会话处理程序 - 当然你可以自己创建解决方案);使用20 MB会话和50个并发用户,您的脚本开始受到磁盘访问速度的严重限制(例如,"脚本启动速度慢,因为糖蜜" - 仅会话就会占用GB的RAM);最后,我们专门用一个盒子在RAM中保存尽可能多的会话,并且前端盒通过NFS访问它们(尽管在我们的情况下它有所帮助,这对你来说可能有点过分)。
请注意,对于磁盘上的许多并发用户和会话存储,会话临时文件的数量可能会导致文件系统限制出现问题(例如,在遇到stat()性能问题之前,一个目录中可以有多少文件)或其他限制(我们曾经发现一个盒子被配置为仅允许同时打开4096个文件的困难方式。这些都不是特定于会话的,但可以通过会话处理来触发。
不,会话可能具有的空间(或会话可能拥有多少变量)没有限制。
唯一的限制是您的计算机上的规格,这是由您的php.ini中的可用memory_limit定义的。
请注意,此空间将在所有用户的所有会话之间共享。
问题不在于我可以拥有多少"会话变量",而在于每个会话变量可以存储多少数据。
它完全特定于您的Web服务器。对于Apache,请看这里:
http://httpd.apache.org/docs/trunk/mod/mod_session.html
它甚至允许使用mod_session_dbd将会话存储在数据库中。因此,可以克服每个会话1个文件的物理限制。此外,Apache可以配置为跟踪存储在特定服务器或服务器组上的每个用户会话,以实现可伸缩性。
您可以在PHP中编写自己的会话处理程序来执行此操作 - 尽管编译后的模块可能更有效。
@shamittomar:如果downvoter没有发表评论,即使你问他们,他们也许不会离开。对于单个downvotes,我不会担心它 - 只是一个无能/随机/驱动器的downvoter。
目前+ 2 / -1;我们可以将关于SO功能的讨论带到meta.stackoverflow.com吗?关于在那里投票有很多有用的答案。
Downvoted,因为我们正在讨论PHP会话。这个Apache模块与PHP完全无关。
简单回答是不。 (也就是说,它们没有比任何其他PHP变量更多的限制......必须适合内存等)
但是,请记住$_SESSION数据存储在某处,默认情况下,每个会话在一个文件中作为序列化数据存储。因此存在实际限制。您不希望在其中存储大量信息,因为它们将在使用session_start()的每个页面上从数据存储中加载/保存。
模板数据可以被视为"巨大的blob"吗?更准确地说,我的模板数据是从HTML文件中用file_get_contents();获取的。大多数情况下它不会比某些KB更大,但将来可能会发现我必须在此会话变量中加载更多更大的模板。
我的主要观点是$_SESSION数据不是免费的。即使您不使用它,您放入其中的所有内容都将加载到每个页面视图中。如果您需要在每个页面视图上访问该模板数据(因此它将以某种形式加载到内存中),那么它是否来自会话或其他地方并不重要。我个人不会将会话用于那种数据,但那只是我。
@Tom:不要这样做。我已经看过了,疯狂就是这样。会话用于存储您需要快速访问的临时数据;模板不是真正的临时(是的,在这种情况下,我认为它们是"巨大的blob")。考虑一些其他模板的缓存机制,但不要将它们放入$ _SESSION。
它不是用于缓存,而是双重POST预防。 POST完成后,它们未被设置。我的系统非常奇怪,同意了。但PRG只是不会削减我的情况,因为我有太多的回复消息。
@Tom:是的,这是对会话的很好用。不知道它与模板有什么关系。
但是在会话中保留某些内容(比如用户信息数组)而不是从数据库中重新查询它会更好吗?
@Zeke,"更好"是主观的,特别是没有细节。但一般来说,通过memcached之类的东西实现适当的缓存层比使用会话作为穷人的缓存更受欢迎。