我在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
不会立即提交会话数据吗?如果是这样,我是否应该立即提交会话,我该怎么做?
答案 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;非常快!
如果有人对此感兴趣,可以给我更多帮助!