zoukankan      html  css  js  c++  java
  • php session阻塞页面分析及优化 (session_write_close session_commit使用)

    转: http://www.tuicool.com/articles/bqeeey

    首先看下下面代码, session1.php 文件

    <?php
    ini_set('session.save_path', './tmp/');
    
    function open($save_path, $session_name) {
        echo __FUNCTION__,"<br/>";
        return (true);
    }
    
    function close(){
        echo __FUNCTION__,"<br/>";
        return (true);
    }
    
    function read($id){
        echo __FUNCTION__,"<br/>";
    }
    
    function write($id, $sess_data){    
        echo __FUNCTION__,"<br/>";
        return (true);
    }
    
    function destroy($id){
        echo __FUNCTION__,"<br />";
          return(true);
    }
    
    function gc($maxlifetime){
        echo __FUNCTION__,"<br />";
         return true;    
    }
    
    session_set_save_handler("open", "close", "read", "write", "destroy", "gc");
    register_shutdown_function('test');
    
    function test()
    {
      echo __FUNCTION__,"<br />";
    }
    
    session_start();
    echo 'aaaaa',"<br />";
    
    /*
    结论->session_start开启后, 会自动执行open,read函数。
    等页面执行完后,会执行shutdown函数.最后后会把session写入进去,然后执行close关闭文件
    从session_start 到页面结束,会一直锁定文件或者保持连接的。
    */
    

    然后通过1个实例子来理解 , 先执行 session2.php 代码, 20秒内执行 session3.php 

    session2.php 文件

    <?php
    //执行 session2.php和session3.php, 
    /*
    因为 session2.php 脚本一直没有结束,结束后 session才会执行写入和关闭操作 (看session1.php 结论), session一直被锁定了
    因此执行session3.php 时会发现 一直处于阻塞状态。  
    */
    /*
    session_start();
    $_SESSION['uname'] = 'lily';
    sleep(20);
    */
    
    //如果用以下代码 就没问题了, 立即提交 写入关闭
    session_start();
    $_SESSION['uname'] = 'lemon';
    session_commit();
    sleep(20);

    session3.php 文件

    <?php
    session_start();
    echo $_SESSION['uname'];

    总结:

    //可以用 session_commit (别名 session_write_close) 立即执行写入关闭 
    /*
    session_start();
    $_SESSION['aaaa'] = 1000;
    session_commit();  //执行commit后,直接会调用,wirte,close操作
    */
    
    /*
    1.只读取session页面,建议打开后,就直接commit,这是$_SESSION变量已经生成了。
    
    2.有对session进行写入页面,建议修改完$_SESSION后,直接调用commit
    
    3.多次打开并且写入,这个不建议使用,比较打开文件,写入都是耗费时间的。如果能一次搞定的,就不要做多次了。 除非,中间执行很耗时的业务。
    
    后记:其实,使用完session,随手commit也不是坏事,养成习惯后。可以节省性能,减少服务器开销。是个不错选择!欢迎大家交流!
    *
    /
  • 相关阅读:
    【工具相关】iOS-Reveal的使用
    iOS-策略模式
    iOS-观察者模式
    iOS-工厂模式
    iOS-MVC模式
    iOS-Delegate模式
    iOS----单例模式(Singleton)
    iOS----支付(微信支付、支付宝支付、银联支付控件集成支付)(转)
    详解Linux系统下PXE服务器的部署过程
    配置iptables实现本地端口转发的方法详解
  • 原文地址:https://www.cnblogs.com/loveyouyou616/p/4078832.html
Copyright © 2011-2022 走看看