php 的 session 默认是已文件形式存储的
当用户发起一个session请求 这时php会对存储session的文件进行加锁操作
当使用session后php不会立即释放该文件锁
会一直等到当前脚本代码全部执行完毕后才会自动释放这个文件锁
这样以来当用户在A页面操作session后又执行了过长时间的业务脚本
那么会导致当前用户执行其他页面时被A页面的session阻塞住
下面做个实验
# a.php
session_start();
$_SESSION['aaa'] = 200;
echo $_SESSION['aaa'];
sleep(5);
# ---------------------
# b.php
session_start();
echo $_SESSION['aaa'];
先访问a.php页面 然后立即访问b.php
会发现b脚本无法输出 被a脚本阻塞住了
解决办法:
php在操作完session之后并没有立即释放文件锁 可能考虑到当前脚本可能还会有其他的session操作
如果每次操作session都进行加锁解锁的操作消耗也比较大的问题
但是php提供了手动释放session锁的函数
如果当前脚本已经不需要在对session进行操作了 我们可以提前手动释放掉session所
无需等待全部脚本执行结束在自动释放
通过 session_write_close()
函数即可释放session锁
// session_commit() 是 session_write_close() 的别名函数一样可以
代码则为
session_start();
$_SESSION['aaa'] = 200;
echo $_SESSION['aaa'];
session_write_close(); // 使用完session后立即释放session锁
sleep(5);
注意:
如果 session_write_close()
释放掉了session锁后 想继续使用session则必须重新 session_start()
session_start();
$_SESSION['aaa'] = 200;
echo $_SESSION['aaa'];
session_write_close();
session_start();
$_SESSION['aaa'] = 300;
sleep(5);
何时需要手动释放根据业务需求而定
如果操作一个session后需要执行一大段很耗时的业务代码时则建议先释放掉session锁
再次使用时重启开启 如果几次session操作间代码量很小就无所谓了 反复锁操作还有可能加大开销