一个很奇怪的session问题。。

2017-01-02 00:16 出处:360java.com 作者:360java  阅读()
//session_start();$op = @$_GET[#39;op#39;];if($op==#39;1#39;){ for ($i=0; $ilt;=20; $i++) { echo $i; ...

//session_start();
$op = @$_GET['op']; if($op=='1'){ for ($i=0; $i<=20; $i++) { echo $i; sleep(1); } exit('end'); }elseif ($op=='2'){ echo $op; }

1、在浏览器内先访问$op=1时,程序会执行20秒
2、在浏览器内访问$op=2时,程序会立即执行结束。

3、当我使用
session_start();时,重复1、2操作,2会在1执行结束后执行。
4、使用session_start(),将1、2在两个浏览器下操作,2会立即执行结束。
不解,session_start()会锁?

最佳答案

php session存储到文件时,一个session id 一个文件,有时候可能出现一个请求没结束,另一个请求进入便会等待!

是因为文件被锁?session文件和普通文件有区别?我尝试了文件写入:

$op = @$_GET['op'];
$rs = fopen('test.txt', 'a+');

if($op=='1'){
for ($i=0; $i<=20; $i++) {
echo $i;
fwrite($rs, $i);
sleep(1);
}
}elseif ($op=='2'){
echo $op;
fwrite($rs, $op);
}

fclose($rs);
exit('end');

2请求不会等待。

@skillCoding: 

是用来存储session的文件。不是你自己的文件

谢谢帮忙,在论坛查到PHP的Bug列表,发现有人提出了这个问题:

Calling session_start() appears to wait until other scripts have exited

that are using the same session. My guess is the 1st request locks the
session file for exclusive use, and the second request blocks until it
can open it.
  PHP官方的回复是:
Thank you for taking the time to write to us, but this is not a bug.This is expected, the session file is locked to avoid corruption.

由于PHP的Session信息是写入文件的,1个客户端占有1个session文件。因此,当session_start被调用的时候,该文件是被锁住的,而且是以读写模式锁住的(因为程序中可能要修改session的值),这样,第2次调用session_start的时候就被阻塞了

使用session_write_close函数可解除锁定。


分享到:
本文标签:

相关文章

发表评论(共条评论)愿您的每句评论,都能给大家的生活添色彩,带来共鸣,带来思索,带来快乐。

Copyright (C) 360java 360java.com, All Rights Reserved.

苏ICP备16022210号