//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()会锁?

解决方案 »

  1.   

    你的 两个浏览器 是如何打开的?
    如果是两个选项卡或者是通过菜单新建窗口产生的,都会有你说的现象你可以在程序中加入
    echo session_id();来观察和判断 session_start() 会锁的现象
      

  2.   

    1、同一浏览器两个选项卡
    2、不同浏览器一位大侠说: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');结果:同一浏览器下两个选项卡分别执行1、2操作,2会立即执行结束,不存在锁的情况。
      

  3.   

    谢谢帮忙,在论坛查到PHP的Bug列表,发现有人提出了这个问题:
    Calling session_start() appears to wait until other scripts have exitedthat 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函数可解除锁定。