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

nod*_*man 2 php session

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

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

问题:

由于这些更改针对相同的变量,因此服务器如何“排队”这些更改?这里是否可能发生服务器错误?

有没有一种方法可以“锁定”用于读取/写入的会话变量,以便在更改其值之前执行某种状态检查?

编辑 (感谢Unheilig的清理工作)

关于“排队”,我对两个请求同时到达会发生什么感兴趣:

将X更改为1

将X更改为2

我知道这似乎不是现实世界,但是在设计某些东西时我才想到。如果系统允许来自同一用户的太多并发请求,可能会成为问题。

Jim*_*son 5

每个单独的PHP会话都“锁定”在对session_start()的调用与对session_write_close()的调用或请求结束之间(以较早者为准)。

大多数时候,您永远不会注意到这种行为。

但是,如果您的站点确实发出许多并发请求*,那么这些请求似乎将按照先到先服务的顺序排队。

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

因此,要提高请求吞吐量或减少等待的请求:

  • 尽快打开和关闭会话(session_start(),do_work(),session_write_close());以减少会话被锁定以进行写入的时间。
  • 除非绝对必要,否则请确保不会在进行长时间工作的请求(访问第三方API,生成或处理文档,运行长时间数据库查询等)时打开会话。
  • 尽可能避免触摸会话。尽可能保持RESTful。
  • 在应用程序的客户端上尽可能优雅地管理请求的排队和去抖动

希望能有所帮助。

J.

* Ajax和Frame / iFrame繁重的应用程序经常会出现此问题。