美文网首页PHP
PHP session阻塞问题

PHP session阻塞问题

作者: mashen | 来源:发表于2017-09-30 11:53 被阅读0次

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

    相关文章

      网友评论

        本文标题:PHP session阻塞问题

        本文链接:https://www.haomeiwen.com/subject/ktgbextx.html