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

时间:2017-04-07 08:27:07

标签: 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文件,它回应了&#34; SESSION正在运行&#34; 5秒后。

如果我在5秒钟之前在新标签页中打开文件,它会回复&#34; SESSION正在运行&#34;而不是&#34; SESSION已设置&#34;。

要确认,如果我在5秒钟后在新标签页中打开文件,则会回显&#34; SESSION已设置&#34;。

为什么呢? session_write_close不会立即提交会话数据吗?如果是这样,我是否应该立即提交会话,我该怎么做?

2 个答案:

答案 0 :(得分:2)

我认为您做错了什么: 在拥有PHPSESSID cookie之前,请勿打开多个选项卡,否则会得到意外的结果。

第一次运行脚本时,您还没有PHPSESSID cookie。然后在第一个请求完成之前再次运行脚本,您将获得一个 NEW会话(不同的session_id),因此您将不会获得第一个请求的会话数据。

因此,您应该确保浏览器cookie中具有 PHPSESSID

将代码更改为

var myStringNotValidated =  "3T-4T";
var notValidate = Number(myStringNotValidated.substring(3, 4));
if(notValidate === 4){
  console.log("Value1");
}
else{
  console.log("null");
}

首先,运行脚本一次,等待直到完成

然后在5秒钟内打开第二标签和第三标签。

现在您将获得不同的值。

  

第一个标签:array(0){}

     

第二个标签:array(1){[“ val”] => int(1)}

     

第三个标签:array(1){[“ val”] => int(2)}

它表明在第二个选项卡session_commit之后,第三个选项卡获得了正确的值。

答案 1 :(得分:0)

对不起,也许我找到了原因! 1,这就是睡眠功能的原因!如果使用sleep,脚本文件将被阻止。当关于这个php文件的新请求将在5秒后执行。如果使用具有相同代码的另一个php文件将更好。 2,有人说新的会话会不够快。只看这个链接,第三个提示! enter link description here 现在,我应该先创建会话。 好的,我创建了三个php文件。

fisrt - index.php设置会话;

<?php
session_start();
$_SESSION['ddd']=1;
session_commit();
?>

second -index2.php

<?php
session_start();
if(isset($_SESSION['ddd']) && $_SESSION['ddd']==2)
{
echo("SESSION is set");
}
else {
$_SESSION['ddd'] = 2;
session_commit();
echo "SESSION is working";
sleep(5);
}
?>

第三个index3.php

 <?php
session_start();
if(isset($_SESSION['ddd']) && $_SESSION['ddd']==2)
{
echo("SESSION is set");
}
else {
$_SESSION['ddd'] = 2;
session_commit();
echo "SESSION is working";
for ($i=0;$i<10000000;$i++)
{
if(file_exists('sdsd'));
}
}
?>

非常有趣。

fisrt lab: 首先打开index.php。 然后在两个标签中打开index2.php,你会看到,index2.php echo&#39; SESSION的第二个标签设置为&#39;但是,它会在5秒后返回,是的,睡眠功能会阻止它,但是会话已经写好了。好消息。

第二个实验室: 首先打开index.php。 然后打开index2.php,index3.php在两个标签中,你会看到,第二个标签echo&#39; SESSION被设置为&#39;非常快!

如果有人对此感兴趣,可以给我更多帮助!