【问题标题】:Are session variables in shared memory?会话变量是否在共享内存中?
【发布时间】:2013-11-24 22:31:39
【问题描述】:

如果您熟悉 VB.NET 等编程语言,您就会知道有一个名为 Shared-Memory 的东西,它在不同的应用程序实例之间共享。我的问题是:会话变量在 PHP 中的行为是否相同?


假设这种情况:

我在我的网站上单击了两次链接(两个请求都使用相同的标头、相同的 cookie 但在不同的时间发送)。 $_SESSION['num'] 设置为 0 现在:

在 12:00:00.01 服务器收到第一个请求
在 12:00:00.03 第一个请求开始其会话
服务器在 12:00:00.04 秒收到请求
在 12:00:00.05 秒请求开始其会话。
在 12:00:00.06 第一个进程将 10 添加到 $_SESSION['num'] 的值。
在 12:00:00.07 第二个进程将 10 添加到 $_SESSION['num'] 的值。
12:00:00.09 两个过程都完成了。

现在,有两个可能的答案:$_SESSION['num']10$_SESSION['num'] 是 20。哪个是答案?

【问题讨论】:

  • 快速回答:没有。至于您的示例,这完全取决于每个请求是否共享相同的会话
  • @Phil 我说我点击了两次链接,这意味着他们都使用同一个会话!
  • 啊,抱歉。 “点击”是一个如此模糊的术语。如果没有进一步的信息,例如使用了哪个浏览器、选项卡等,我不想贸然下结论。那么答案将是 20。
  • @Phil 我的意思是两个请求完全相同,这里唯一的区别是会话开始的时间!
  • 您似乎对 session 是什么感到有些困惑。我建议你从这里开始 - php.net/manual/intro.session.php

标签: php session shared-memory


【解决方案1】:

对您的问题的通常回答是“测试时发生了什么?”

PHP 将存储您的会话wherever you tell it to 存储会话:文件、共享内存、数据库。默认情况下,它使用文件。调用 session_start() 时从存储中检索会话,调用 session_write_close() 或脚本退出时将其写回到存储中。

如果您的会话处理程序获得了存储锁定,那么第二个实例将被阻塞,直到第一个实例写回更改。默认文件处理程序acquires locks

【讨论】:

  • 我无法测试它,因为我无法同时发送请求!不过谢谢!
  • 为什么不呢? (提示:看看 sleep() 函数)。
  • 我试过了,但似乎浏览器不会同时发送请求。他们等待第一个请求完成,然后开始另一个!
  • 大多数浏览器同时发送请求。尝试打开一个新窗口/选项卡(应该继承会话 cookie)或简单地创建一个带有 2 个 iframe 的 HTML 页面。
猜你喜欢
  • 2015-08-27
  • 1970-01-01
  • 1970-01-01
  • 2010-09-19
  • 1970-01-01
  • 2023-03-06
  • 2010-12-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多