PHP并发更改同一用户的会话变量


PHP concurrent changes on session variable for same user?

假设我们有一个用户变量$_SESSION['variable'],它可以在用户访问页面时被修改,也可以不被修改。

假设同一用户同时打开多个浏览器窗口,并以某种方式同时向服务器发出请求,导致会话变量发生更改。

问题:

服务器如何"排队"这些更改,因为它们是针对的相同的变量?这里有可能出现服务器错误吗?

是否有一种方法来"锁定"会话变量的读/写为了在更改其属性之前实现某种状态检查价值吗?

编辑(感谢Unheilig清理)

关于"排队",我感兴趣的是如果两个请求同时到达会发生什么:

将X改为1

将X改为2

我知道这看起来不像一个现实世界的场景,但它只是在我设计东西的时候出现在我的脑海里。如果系统允许来自同一用户的太多并发请求,这可能会成为一个问题。

每个单独的PHP会话在调用session_start()和调用session_write_close()或请求结束之间被'锁定',以较早的为准。

大多数时候你不会注意到这个行为。

然而,如果你的站点确实有很多并发请求*,那么这些请求就会按照先到先得的顺序排队。

要清楚;在典型的Apache/PHP设置中,您的请求将传入服务器并同时启动PHP执行。session_start()调用将阻塞/暂停/等待/队列,因为它正在等待获得会话文件的文件锁(或类似的取决于您的session_handler)。

增加请求吞吐量或减少等待请求:

  • 尽快打开和关闭会话(session_start(), do_work(), session_write_close());
  • 确保你没有在长时间工作的请求上打开会话(访问第三方api,生成或操纵文档,运行长数据库查询等)。除非绝对必要。
  • 尽可能避免触碰会话。尽可能多地休息。
  • 在应用程序的客户端尽可能优雅地管理请求的排队和退出

希望对你有帮助。

j .

* Ajax,Frame/iFrame较多的应用程序经常出现这个问题。