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

时间:2014-03-10 22:44:18

标签: php session

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

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

问题:

  

服务器如何“排队”这些更改,因为它们的目标是   相同的变量?这里是否存在服务器错误的可能性?

     

是否有办法“锁定”会话变量以进行读/写   在更改之前要执行某种状态检查   值?

修改 (感谢Unheilig的清理工作)

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

  

将X更改为1

     

将X更改为2

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

1 个答案:

答案 0 :(得分:4)

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

大部分时间你都不会注意到这种行为。

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

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

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

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

希望有所帮助。

学家

* Ajax& Frame / iFrame繁重的应用程序经常出现这个问题。