php - 使用 $_SESSION 缓冲/缓存 MySQL 查询

标签 php mysql session caching

我正在开发一个网站。目前,我正在使用 cheapo 共享主机。但是男孩可以做梦,而且我已经在考虑如果我的网站上有更多的用户会发生什么。

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

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

问题:

  1. 这可能吗?有没有办法在 session 因超时或浏览器关闭而销毁时执行函数?

  2. 这合理吗?数百个并发 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 定义自己的自定义 session 处理程序,并且部分定义提供了 destroygc 回调函数。这两个在 session 被显式销毁时以及 session 因过期而销毁时被调用,因此它们完全按照您的要求进行。

但是,由于超时导致的 session 过期不会以精确的方式发生;在过期的 session 实际上被“垃圾收集”之前可能需要很多时间。此外,垃圾收集触发器 probabilistically所以在理论上有可能过期的 session 永远不会被垃圾回收。

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.

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

  • 过早的优化(在你衡量之前,不要只是假设它会“更好”)。
  • session 可能永远不会被垃圾回收;即使这没有发生,您也无法控制收集它们的时间。这可能是个问题。
  • 有可能会丢失 session 中包含的所有内容(例如服务器重启),其中包括玩家进度。玩家不喜欢失去进度。
  • 同一用户的并发 session 是不可能的(谁的“已保存数据”获胜并保留在数据库中?)。

替代方案呢?

好吧,既然我们谈论的是 el cheapo 共享主机,您肯定不会控制服务器,所以任何涉及 PHP 扩展(例如 memcached)的东西都是有条件的。数据库端缓存也不会运行。此外,您服务器上的负载将受到您无法控制的变量的影响,因此您实际上无法进行任何容量规划。

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

之后,你可以引入只读缓存:通常有很多你需要显示但不打算修改的东西。对于“几乎从不”更新的数据,您可以在需要时使 session 缓存失效,这可能是一个简单且非常有效的改进(您甚至可以在失效方面出现误报,只要它们在宏伟的计划)。

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

关于php - 使用 $_SESSION 缓冲/缓存 MySQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10192554/

相关文章:

php - 将表条目实时更新到数据库 SQL PDO AJAX

php - 如何防止表单变量名泄露数据库结构?

php - 奇怪的 MySQL/PHP 错误

php - Doctrine- 按日期分组

c# - 如何将菜单项(文本)保存到动态 session 状态

php - 简单的 PHP session 错误

java - setSession() 没有被调用?

php - 简单 XML 命名空间警告

php - 在 MySQL 的 TRANSACTION block 之外运行插入

python - Django 查询集 : cannot filter by current week when USE_TZ is enabled