将大数据存储在会话变量中是一种好习惯吗?

Nid*_*ger 3 php mysql session

我目前正在编写一个php站点,每次都需要查询大量数据(大约4 - 5MB).我已经有一个会话,并且想问一下,如果将这些数据存储在会话变量中的良好做法?

当前的计划是在数据库中维护一个表,其中包含表最后一次更改的时间.如果该时间戳更新,那么将再次查询数据,如果不是,则使用会话变量的数据作为其仍然一致...

这是避免查询过多数据的好方法吗?当会话大小约为5MB时,网站会有什么样的速度影响?

提前致谢!

sam*_*lev 8

这不是一个很好的练习(它会让PHP咀嚼的内存远远超过实际应用),但我不确定它会如何影响性能.

我想真正的问题是:为什么你需要在会话中存储这么多?如果它是在会话之间可以访问的信息,那么您应该将其存储在数据库中并"按需"加载它.

如果它是仅在会话有效时才相关的二进制数据(图像,文件等),则将其存储在用户的临时文件中(查看tempnam()sys_get_temp_dir()),然后将临时文件名存储在会议.


Sim*_*mba 5

不,这样做不是一个好习惯。

要考虑的要点:

  • 默认情况下,会话数据存储在磁盘上的temp文件夹中。每次调用时session_start()(即每次加载页面时),都必须将整个数据加载到内存中并填充到会话数组中。如果要加载大量数据,则可能会影响性能。

  • 另外,由于您每次都加载大量数据,这意味着每次页面加载都将占用更多内存。这减少了服务器可以支持的并发用户数。

  • 如果您出于缓存目的而执行此操作以减少对数据库的访问,则可以使用更好的解决方案。与建议的定制解决方案相比,APCu,Memcache,Redis和其他工具在缓存数据方面都可以做得更好。还提供了包装器库,这些包装器库使它变得更加简单,并允许您在缓存解决方案之间进行混合和匹配。如果您使用的是Laravel或Symphony之类的框架,则可能在框架中内置了缓存类。另外,您可以尝试使用像phpFastCache这样的独立库。而且,不要忘记,现代数据库引擎内置了自己的缓存机制,因此,对相同或相似查询的重复调用无论如何都应该合理地快速。