zoukankan      html  css  js  c++  java
  • session 入库的实现

    随着 session 的增加,管理已经不方便。这时,考虑使用 mysql 数据库管理。建立一个表管理 session 。 更改 session 的存储机制,让 session 不再存在文件中,而是入库。更该存储机制,只需要在文件中增加函数 session_set_save_handler() 便可。代码如下:
     
     
     
    // 重写 session 的存储机制
     
    function sess_open(){
      echo __FUNCTION__;
    }
    function sess_close(){
      echo __FUNCTION__;
    }
     
    function sess_read($sess_id){
      echo __FUNCTION__;
    }
     
    function sess_write($sess_id, $sess_data){
      echo __FUNCTION__;
    }
    function sess_destroy(){
      echo __FUNCTION__;
    }
    function sess_gc(){
      echo __FUNCTION__;
    }
     
    session_set_save_handler(
      'sess_open', 
      'sess_close',
      'sess_read',
      'sess_write',
      'sess_destroy',
      'sess_gc'
    );
     
    session_start();
     
     
    这要写了 session_set_save_handler() ,php 就知道要更改 session 的存储机制了。如果没写,那还是存到文件中。这函数的参数,分别对应了 session 运行机制的各个方面。参数名字,也就是函数名,可以改变,不一定这样写,这样写是为了便于阅读理解。 执行顺序也不是从上到下,而是:open -> reader -> write -> close .
     
     
    ————————————————————————————————————
     
    数据库表 session 信息:
     
    session <wbr>入库的实现


     
    session <wbr>入库的实现

     
     
    实现 session 入库功能的完整代码:
     
     
    // 重写 session 的存储机制
     
    // 最重要的三个函数: read,write,destroy 。
    // 有了这几个就能完成 session 功能。
    // 其他的函数的函数体可以什么都不写。
     
    function sess_open(){
      echo __FUNCTION__;
      $link = mysql_connect('127.0.0.1', 'root', '');
      mysql_query('set names utf8');
      mysql_query('use study');
    }
     
    function sess_close(){
      echo __FUNCTION__;
    }
     
    function sess_read($sess_id){
      echo __FUNCTION__;
      $sql = "select sess_data from `session` where sess_id = '$sess_id'";
      $result = mysql_query($sql);  // $link 可以自己找到,或可以声明为全局变量
      if($rows = mysql_fetch_assoc($result)){
        return $rows['sess_data'];
      }else{
        return '';
      }
    }
     
    function sess_write($sess_id, $sess_data){
      echo __FUNCTION__;
     
      //当前 session 存在则更新 sess_data
      //获得时间戳,mysql函数:unix_timestamp(); 
      //获得时间戳,php函数:time(); 
      $sql = "insert into `session` values('$sess_id', '$sess_data', now())
      on duplicate key update sess_data = '$sess_data',times = now()";  //这是为了gc()
      return mysql_query($sql);
    }
     
    function sess_destroy($sess_id){
      echo __FUNCTION__;
      $sql = "delete from `session` where sess_id = '$sess_id'"; 
      return mysql_query($sql);
    }
    function sess_gc(){
      echo __FUNCTION__;
    }
     
    session_set_save_handler(
      'sess_open', 
      'sess_close',
      'sess_read',
      'sess_write',
      'sess_destroy',
      'sess_gc'
    );
     
    session_start();
     
    var_dump($_SESSION);
     
    $_SESSION['name'] = 'fff';
    $_SESSION['age'] = '24';
     
    //session_destroy();
     
     
    ——————————————————————————
     
    总结 session 运行机制:
     
    1. 打开 session 时,语法上执行函数 session_start() ,php 的 session 机制读取浏览器端的 cookie,语法上表示为 $_cookie['PHPSESSID']。
     
    2. 根据 cookie 找到存储在服务器端的 session 数据。
     
    3. 把 session 数据反序列化,赋值给变量 $_SESSION 。
     
    4. 之后对变量 $_SESSION 的操作都是对变量的操作,不会更新 session 文件。
     
    5. 是否执行了 session_destroy() 函数,如果执行了,那么删除服务器端的 session 文件。
     
    6. 脚本结束时,判断是否有 sessin 文件,或者说是否执行过 session_destroy() 方法。如果没有执行过,则把 $_SESSION 变量中的数据写入到 session 文件中。如果执行过,那么什么也不做。
  • 相关阅读:
    网站安全:你面临2个至关重要的挑战!
    一个只需要点 「下一步」就完成监控 Windows
    论MOBA类游戏五号位的重要性
    CloudTest 事务监控:千呼万唤始出来
    深入浅出 ES6:ES6 与 Babel / Broccoli 的联用
    精华阅读第7期|程序员职业人生规划的三点建议
    (12)打鸡儿教你Vue.js
    (11)打鸡儿教你Vue.js
    (10)打鸡儿教你Vue.js
    (9)打鸡儿教你Vue.js
  • 原文地址:https://www.cnblogs.com/susancain/p/5186561.html
Copyright © 2011-2022 走看看