php循环阻塞问题,PHP session阻塞问题

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操作间代码量很小就无所谓了 反复锁操作还有可能加大开销

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值