首页 新闻 会员 周边 捐助

一个很奇怪的session问题。。

0
悬赏园豆:50 [已解决问题] 解决于 2012-04-09 18:11

//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
skillCoding的主页 skillCoding | 菜鸟二级 | 园豆:283
提问于:2012-04-09 17:33
< >
分享
最佳答案
0

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

收获园豆:50
玉开 | 大侠五级 |园豆:8822 | 2012-04-09 17:39

是因为文件被锁?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 | 园豆:283 (菜鸟二级) | 2012-04-09 17:56

@skillCoding: 

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

玉开 | 园豆:8822 (大侠五级) | 2012-04-09 18:04

谢谢帮忙,在论坛查到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函数可解除锁定。


skillCoding | 园豆:283 (菜鸟二级) | 2012-04-09 18:08
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册