php session_write_close() 在脚本执行完成之前不提交?

标签 php session

我在 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/

相关文章:

php - 从 session 用户名中选择

c# - 如何使用服务处理 NHibernate session 生命周期?

ruby - Sinatra session 未按预期持续

php - 从 PHP 回显 RTF 时获取换行符而不是斜杠-f-s

javascript - PHP AJAX 使用 while 循环提交表单

ruby-on-rails - Rails : How do I minimize DB hits here? 预加载不适用

ruby-on-rails - Rails 5 和 Devise : How I disable sessions on a Token Based Strategy without Altering the default one

php - 使用 PHP 生成 OpenOffice calc 文件

javascript - 将 html 表单数据发送到发件人的电子邮件

php - 如何更改数据库行位置并维护 php 和 mysql 中的顺序