使用$ _SESSION来缓冲/缓存MySQL查询

Rya*_*yan 7 php mysql session caching

我正在开发一个网站.目前,我正在使用cheapo共享主机.但是一个男孩可以做梦,而且我已经在思考我网站上有大量用户会发生什么.

访问者将需要偶尔进行数据库写入,因为他们会记录他们在网站上的游戏进度.

我想通过将进度和其他信息直接写入$_SESSION变量来最小化查询.只有当会话被销毁(注销,浏览器关闭或超时)时,我才想将内容写入$_SESSION数据库.

问题:

  1. 那可能吗?当超时或关闭浏览器破坏会话时,有没有办法执行函数?

  2. 这是否明智?几百个并发SQL查询对于共享服务器来说是一个问题,并且使用$_SESSION缓冲区来减轻其中的一部分.

Jon*_*Jon 6

当超时或关闭浏览器破坏会话时,有没有办法执行函数?

是的,但它可能不会像你想象的那样工作.您可以使用定义自己的自定义会话处理程序session_set_save_handler,并且定义的一部分是提供destroygc回调函数.当会话被明确销毁并且由于已经过期而被销毁时,会调用这两个,因此它们完全按照您的要求执行.

但是,由于超时导致的会话到期不会发生在发条精度上; 在过期的会话实际上是"垃圾收集"之前可能需要很长时间.此外,垃圾收集在概率上触发,因此理论上过期会话永远不会被垃圾收集.

这是否明智?几百个并发SQL查询对于共享服务器来说是一个问题,并且使用$ _SESSION作为缓冲区来减轻其中的一部分.

我真的不会这样做有几个原因:

  • 过早优化(在测量之前,不要只是假设它会"更好").
  • 会话可能永远不会被垃圾收集; 即使没有发生这种情况,也无法控制何时收集它们.这可能是个问题.
  • 有可能丢失会话包含的所有内容(例如服务器重新启动),其中包括玩家进度.玩家不喜欢失去进步.
  • 同一个用户的并发会话是不可能的(其"保存的数据"获胜并保持持久存储到数据库中?).

替代方案呢?

好吧,既然我们正在谈论el cheapo共享托管,你绝对不会控制服务器,所以涉及PHP扩展的任何东西(例如memcached)都是有条件的.数据库端缓存也不会飞.此外,服务器上的负载将受到控制之外的变量的影响,因此您无法进行任何容量规划.

无论如何,我首先要确保数据库本身的结构是最佳的,并且代码的编写方式可以最大限度地减少数据库的负载(只需在编辑器中输入内容即可实现性能).

之后,您可以引入只读缓存:通常需要显示很多东西,但不打算修改.对于"几乎从不"更新的数据,会在您需要的时候使您无效的会话缓存可以是一个简单而有效的改进(您甚至可以在失效方面有误报,只要它们不是太多了宏伟的计划).

最后,如果您担心在单个请求期间从数据库中提取两次相同的数据,则可以添加按请求缓存(在变量中).


nol*_*oli 5

在会话被销毁时写入数据不是一个好主意.由于会话数据可以通过您的主机配置的垃圾收集器销毁,因此您不知道会话何时真正关闭,直到用户的cookie过期为止.

所以...我建议您使用共享内存(RAM)缓存系统,如memcache(如果您的主机提供)或基于磁盘的缓存系统.

顺便说一下,如果你的查询被优化,列被正确索引等,你的共享主机可能会在"同一时间"进行大量查询.

  • 在您知道自己遇到问题之前不要进行优化.当你有足够的负载这是一个问题时,你的主机将让你移动到你自己的专用服务器. (4认同)