访问者将需要偶尔进行数据库写入,因为他们会记录他们在网站上的游戏进度.
我想通过将进度和其他信息直接写入$_SESSION变量来最小化查询.只有当会话被销毁(注销,浏览器关闭或超时)时,我才想将$_SESSION的内容写入数据库.
问题:
>那可能吗?当会话被超时或关闭浏览器销毁时,有没有办法执行函数?
>这是否合情合理?几百个并发SQL查询对于共享服务器来说是一个问题,并且使用$_SESSION作为缓冲区来减轻其中的一部分.
Is there a way to execute a function when the sessions is destroyed by
timeout or closing of the browser?
是的,但它可能不会像你想象的那样工作.您可以使用session_set_save_handler
定义自己的自定义会话处理程序,部分定义是提供destroy和gc回调函数.当会话被明确销毁并且由于已经过期而被销毁时,会调用这两个,因此它们完全按照您的要求执行.
但是,由于超时而导致的会话到期不会发生在发条精度上;在过期的会话实际上是“垃圾收集”之前可能需要很长时间.此外,垃圾收集会触发probabilistically,因此从理论上讲,过期的会话永远不会被垃圾收集.
Is that sensical? Are a couple of hundred concurrent sql queries going
to be a problem for a shared server and is the idea of using $_SESSION
as a buffer going to alleviate some of this.
我真的不会这样做有几个原因:
>过早优化(在测量之前,不要只是假设它会“更好”).
>会话可能永远不会被垃圾收集;即使没有发生这种情况,也无法控制何时收集它们.这可能是个问题.
>有可能丢失会话所包含的所有内容(例如服务器重新启动),其中包括玩家进度.玩家不喜欢失去进步.
>对于同一用户的并发会话是不可能的(其“已保存的数据”获胜并保持持久到数据库?).
替代方案呢?
好吧,既然我们正在谈论el cheapo共享托管,你绝对不会控制服务器,所以涉及PHP扩展的任何东西(例如memcached)都是有条件的.数据库端缓存也不会飞.此外,服务器上的负载将受到控制之外的变量的影响,因此您无法进行任何容量规划.
在任何情况下,我首先要确保数据库本身的结构是最佳的,并且代码的编写方式可以最大限度地减少数据库的负载(仅通过在编辑器中输入内容就可以获得免费性能).
之后,您可以引入只读缓存:通常需要显示很多东西,但不打算修改.对于“几乎从不”更新的数据,会话缓存在您需要时无效,可能是一种简单而有效的改进(您甚至可以在失效方面产生误报,只要它们不是太多,宏伟的计划).