SESSION 阻塞

问题

使用session过程中,在开启session后,同一浏览器执行同一程序,不同页面会被锁,不同浏览器不会出现这种情况

原因

由于PHP的Session信息是写入文件的,1个客户端占有1个session文件,因此,当 session_start 被调用的时候,该文件是被锁住的,而且是以读写模式锁住的,所以第2次调用 session_start 的时候就被阻塞了

解决

使用 session_write_close 函数(Write session data and end session),也就是写session的数据,同时关闭这个session,因此在用完session之后,调用这个函数关闭 session 文件即可解除锁定

Demo

创建 test1.php 和 test2.php 文件

1
2
3
4
5
6
7
8
// test1.php
<?php
date_default_timezone_set('PRC');
session_start();
$_SESSION['test1'] = date('H:i:s');
//session_write_close();
sleep(5);
echo $_SESSION['test1'];

1
2
3
4
5
6
// test2.php
<?php
date_default_timezone_set('PRC');
session_start();
$_SESSION['test2'] = date('H:i:s');
echo $_SESSION['test2'];

先访问 test1.php 再访问 test2.php, test2.php 必须等 test1.php 执行完毕后才会执行,这时将 test1.php 的 session_write_close() 取消注释,再测试一遍,这时2个脚本就可以同时执行了

0%