我在 Chrome 中测试了这个脚本。
<?php
session_start();
if(isset($_SESSION['ddd']) && $_SESSION['ddd']) {
exit("SESSION is set");
} else {
$_SESSION['ddd'] = true;
session_write_close();
//session_commit() is also not work
sleep(5);
exit("SESSION is working");
}
我在 Chrome 中打开 PHP 文件,5 秒后它会回显“SESSION 正在运行”。
如果我在 5 秒过去之前在新选项卡中打开文件,它会回显“SESSION 正在工作”,而不是“SESSION 已设置”。
为了确认,如果我在 5 秒后在新选项卡中打开文件,它会回显“SESSION is set”。
为什么?session_write_close
是否不会立即提交 session 数据?如果是这样,我应该立即提交 session 吗?
最佳答案
我认为你做错了什么: 在拥有 PHPSESSID cookie 之前切勿打开多个选项卡,否则您将得到意外结果。
第一次运行脚本时,您还没有 PHPSESSID cookie。而你在第一个请求完成之前再次运行脚本,你会得到一个NEW session(不同的session_id),所以你不会得到第一个请求的session数据。
因此,您应该确保您的浏览器 cookie 中有 PHPSESSID。
将代码更改为
session_start();
var_dump($_SESSION);
$_SESSION['val'] = isset($_SESSION['val']) ? ++$_SESSION['val'] : 0;
session_commit();
sleep(5);
exit;
首先,运行脚本一次,等待其完成。
然后在 5 秒内打开第二标签和第三标签。
现在您将获得不同的值。
1st tab: array(0) { }
2nd tab: array(1) { ["val"]=> int(1) }
3rd tab: array(1) { ["val"]=> int(2) }
这表明第三个选项卡在第二个选项卡 session_commit 之后获得了正确的值。
关于php session_write_close() 在脚本执行完成之前不提交?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43273275/