CodeIgniter kndb session 用法简介

转载 2012年03月27日 14:35:22

CIsession有点问题,很多时候需要挂载其他的扩展session,CI中国论坛网友推荐了kndb session,我大致用了一下,下面简单介绍下用法:
第一步:建立系统数据库,这里假设数据库名是test;
第二步:建立存储session的数据表sessions

    CREATE TABLE sessions (
    session_id varchar(32) NOT NULL,
    session_last_access int(10) unsigned,
    session_data text,
    PRIMARY KEY (session_id)
    );


第三步:修改CI文件夹/system/application/config/config.php

  1. $config['sess_cookie_name']            = 'CISESSION'
  2. $config['sess_expiration']            = 7200; 
  3. $config['sess_encrypt_cookie']        = FALSE; 
  4. $config['sess_table_name']            = 'sessions'
  5. $config['sess_match_ip']            = TRUE; 
  6. $config['sess_match_useragent']        = TRUE; 
  7. $config['sess_use_database']        = TRUE; 
  8. $config['sess_time_to_update']        = 300; 

第四步:在CI文件夹/system/application/libraries下建立文件Session.php,输入以下内容

  1. <?php  if (!defined('BASEPATH')) exit('No direct script access allowed'); 
  2. /** 
  3. * Code Igniter 
  4. * 
  5. * An open source application development framework for PHP 4.3.2 or newer 
  6. * 
  7. * @package     CodeIgniter 
  8. * @author      Elise Bosse 
  9. * @copyright   Copyright (c) 2008, E.Bosse 
  10. * @license     http://www.codeignitor.com/user_guide/license.html 
  11. * @link        http://www.codeigniter.com 
  12. * @since       Version 1.2 
  13. * @filesource 
  14. */ 
  15.   
  16. // ------------------------------------------------------------------------ 
  17.   
  18. /** 
  19. * Session class using native PHP session features and hardened against session fixation. 
  20. * Non-database part is based upon Dariusz Debowczyk's Native session library with some updates. 
  21. * The DB part makes use of PHP's session_set_save_handler() functionality 
  22. * This library is written for PHP 5 but it could be altered a bit to make it work in PHP4 
  23. * 
  24. * @package     CodeIgniter 
  25. * @subpackage  Libraries 
  26. * @category    Sessions 
  27. * @author      Elise Bosse 
  28. * @link        http://www.codeigniter.com/user_guide/libraries/sessions.html 
  29. * @class link  http://codeigniter.com/wiki/KNDB_Session/ 
  30. */ 
  31.   
  32. /** 
  33. * If using a database, create the following database table and make sure config file is set properly 
  34. * 
  35. * CREATE TABLE sessions ( 
  36. * session_id varchar(32) NOT NULL, 
  37. * session_last_access int(10) unsigned, 
  38. * session_data text, 
  39. * PRIMARY KEY (session_id) 
  40. * ); 
  41. */ 
  42.   
  43. class MY_Session { 
  44.   
  45.   private $_lifetime
  46.   private $_sess_id_ttl
  47.   private $_match_ip
  48.   private $_match_useragent
  49.   private $_sess_db;   
  50.   private $_useDB
  51.   private $_sess_table
  52.   private $_flash_key = 'flash'// prefix for "flash" variables (eg. flash:new:message) 
  53.   
  54.   function __construct() 
  55.   { 
  56.     $this->object =& get_instance(); 
  57.   
  58.     // set config variables 
  59.     $this->_lifetime = $this->object->config->item('sess_expiration'); 
  60.     $this->_sess_id_ttl = $this->object->config->item('sess_time_to_update'); 
  61.     $this->_match_ip = $this->object->config->item('sess_match_ip'); 
  62.     $this->_match_useragent = $this->object->config->item('sess_match_useragent'); 
  63.     $this->_useDB = $this->object->config->item('sess_use_database'); 
  64.     $this->_sess_table = $this->object->config->item('sess_table_name'); 
  65.   
  66.     log_message('debug'"Session Class Initialized"); 
  67.   
  68.     $this->_sess_run(); 
  69.   } 
  70.   
  71.   /** 
  72.    * Starts up the session system for current request 
  73.    */ 
  74.   function _sess_run() 
  75.   { 
  76.     // Set session table and register this object as the session handler, if using databases 
  77.     if ($this->_useDB == TRUE) { 
  78.       session_set_save_handler(array(&$this"_open"), array(&$this"_close"), array(&$this"_read"), 
  79.                    array(&$this"_write"),array(&$this"_destroy"),array(&$this"_gc")); 
  80.     } 
  81.   
  82.     session_start(); 
  83.   
  84.     // if no lifetime set in config, set to 2 years 
  85.     if (!is_numeric($this->_lifetime) || $this->_lifetime <= 0) { 
  86.       $this->_lifetime = (60*60*24*365*2); 
  87.     } 
  88.   
  89.     // if no session ID regeneration time set in config, set to 30 minutes 
  90.     if (!is_numeric($this->_sess_id_ttl) || $this->_sess_id_ttl <= 0) { 
  91.       $this->_sess_id_ttl = 1800; 
  92.     } 
  93.   
  94.     // check if session has expired 
  95.     if ($this->_session_expired()) { 
  96.       $this->sess_destroy(); 
  97.       return FALSE; 
  98.     } 
  99.   
  100.     // match IP address if necessary 
  101.     if ($this->_match_ip == TRUE) { 
  102.       if ($this->_ips_match() == FALSE) { 
  103.     $this->sess_destroy(); 
  104.     return FALSE; 
  105.       } 
  106.     } 
  107.      
  108.     // match user agent if necessary 
  109.     if ($this->_match_useragent == TRUE) { 
  110.       if ($this->_useragents_match() == FALSE) { 
  111.     $this->sess_destroy(); 
  112.     return FALSE; 
  113.       } 
  114.     } 
  115.   
  116.     // regenerate session id if necessary 
  117.     // session data stays the same, but old session storage is destroyed 
  118.     if ( $this->_sess_id_expired() ) {       
  119.       $this->regenerate_id(); 
  120.     } 
  121.   
  122.     // delete old flashdata (from last request) 
  123.     $this->_flashdata_sweep(); 
  124.   
  125.     // mark all new flashdata as old (data will be deleted before next request) 
  126.     $this->_flashdata_mark(); 
  127.   
  128.     // finally, set last access time to now 
  129.     $this->set_userdata('sess_last_access', time()); 
  130.   } 
  131.   
  132.   /** 
  133.    * Checks if session has expired 
  134.    */ 
  135.   function _session_expired() 
  136.   { 
  137.     // if this is the first time coming in, initialize access time 
  138.     if (!$this->userdata('sess_last_access')) { 
  139.       $this->set_userdata('sess_last_access', time()); 
  140.       return FALSE; 
  141.     } 
  142.   
  143.     $delta = time() - $this->userdata('sess_last_access'); 
  144.   
  145.     if ($delta  >=  $this->_lifetime ) { 
  146.       return true; 
  147.     } 
  148.   
  149.     return false; 
  150.   } 
  151.   
  152.   /** 
  153.    * Checks if stored IP matches current IP 
  154.    */ 
  155.   function _ips_match() { 
  156.     // if this is the first time coming in, initialize IP address 
  157.     if (!$this->userdata('sess_ip_address')) { 
  158.       $this->set_userdata('sess_ip_address',  $this->object->input->ip_address()); 
  159.       return TRUE; 
  160.     }     
  161.   
  162.     return $this->userdata('sess_ip_address') == $this->object->input->ip_address(); 
  163.   } 
  164.   
  165.   /** 
  166.    * Checks if stored user agent matches current user agent 
  167.    */ 
  168.   function _useragents_match() { 
  169.     // if this is the first time coming in, initialize user agent 
  170.     if (!$this->userdata('sess_useragent')) { 
  171.       $this->set_userdata('sess_useragent', trim(substr($this->object->input->user_agent(), 0, 50))); 
  172.       return TRUE; 
  173.     }     
  174.   
  175.     return $this->userdata('sess_useragent') == trim(substr($this->object->input->user_agent(), 0, 50)); 
  176.   } 
  177.   
  178.   
  179.   /** 
  180.    * Checks if session id needs regenerating 
  181.    */ 
  182.   function _sess_id_expired() 
  183.   { 
  184.     // if this is the first time coming in, initialize regenerated time 
  185.     if (!$this->userdata('sess_last_regenerated')) { 
  186.       $this->set_userdata('sess_last_regenerated', time()); 
  187.       return false; 
  188.     } 
  189.   
  190.     $delta = time() - $this->userdata('sess_last_regenerated'); 
  191.   
  192.     if ( $delta >=  $this->_sess_id_ttl ) { 
  193.       return true; 
  194.     } 
  195.   
  196.     return false; 
  197.   } 
  198.   
  199.   
  200.   /** 
  201.    * Regenerates session id 
  202.    */ 
  203.   function regenerate_id() 
  204.   { 
  205.     // regenerate session id and store it 
  206.     // $delete_old_session parameter works in PHP5 only! 
  207.     session_regenerate_id(TRUE); 
  208.   
  209.     // update the session generation time 
  210.     $this->set_userdata('sess_last_regenerated', time()); 
  211.   } 
  212.   
  213.   
  214.   /** 
  215.    * Destroys the session and erases session storage 
  216.    */ 
  217.   function sess_destroy() 
  218.   { 
  219.     session_unset(); 
  220.     if ( isset( $_COOKIE[session_name()] ) ) 
  221.       { 
  222.     //@@@ was having trouble just using setcookie() because it wasn't unsetting fast enough 
  223.     unset($_COOKIE[session_name()]); 
  224.     setcookie(session_name(), '', time()-42000, '/'); //@@@ 
  225.       } 
  226.   
  227.     session_destroy(); 
  228.   } 
  229.   
  230.   
  231. /**                                                                                                                                             
  232.    * returns the session id of the currentsession                                                                                                
  233.    */ 
  234.   function get_sess_id() { 
  235.     return session_id(); 
  236.   } 
  237.   
  238.   
  239.   /** 
  240.    * Reads given session attribute value: single variable, element of single dimensional array, or property of object 
  241.    * I was kind of of two minds about whether the object bit should be implemented 
  242.    * so you can take out that logic if you wish 
  243.    */     
  244.   function userdata($item$subitem=null) 
  245.   { 
  246.     // this item is in an array 
  247.     if ($subitem) { 
  248.       if ($subitem == 'session_id'){ //added forbackward-compatibility                                                                           
  249.         return session_id(); 
  250.       } else { 
  251.         // array vs. object: handled differently 
  252.         if (isset($_SESSION[$item])) { 
  253.           if (is_array($_SESSION[$item])) return (!isset($_SESSION[$item][$subitem])) ? false : $_SESSION[$item][$subitem]; 
  254.           if (is_object($_SESSION[$item])) return(!isset($_SESSION[$item]->$subitem)) ? false :$_SESSION[$item]->$subitem
  255.           return false; 
  256.         } 
  257.       } 
  258.     } 
  259.   
  260.     // this item is not in an array 
  261.     else { 
  262.       if($item == 'session_id'){ //added for backward-compatibility 
  263.         return session_id(); 
  264.       } else { 
  265.         return ( ! isset($_SESSION[$item])) ? false : $_SESSION[$item]; 
  266.       } 
  267.     } 
  268.   
  269.   } 
  270.   
  271.   /** 
  272.    * Returns all session data 
  273.    */     
  274.   function all_userdata() 
  275.   { 
  276.     if (isset($_SESSION['session_id'])) { //added for backward-compatibility 
  277.       $_SESSION['session_id'] = session_id(); 
  278.     } 
  279.     return $_SESSION
  280.   } 
  281.   
  282.   /** 
  283.    * Sets session attributes to the given values 
  284.    */ 
  285.   function set_userdata($newdata = array(), $newval = ''
  286.   { 
  287.     if (is_string($newdata)) 
  288.       { 
  289.     $newdata = array($newdata => $newval); 
  290.       } 
  291.   
  292.     if (count($newdata) > 0) 
  293.       { 
  294.     foreach ($newdata as $key => $val
  295.       { 
  296.         $_SESSION[$key] = $val
  297.       } 
  298.       } 
  299.   } 
  300.   
  301.   /** 
  302.    * Erases given session attributes 
  303.    */ 
  304.   function unset_userdata($newdata = array()) 
  305.   { 
  306.     if (is_string($newdata)) 
  307.       { 
  308.     $newdata = array($newdata => ''); 
  309.       } 
  310.   
  311.     if (count($newdata) > 0) 
  312.       { 
  313.     foreach ($newdata as $key => $val
  314.       { 
  315.         unset($_SESSION[$key]); 
  316.       } 
  317.       } 
  318.   } 
  319.   
  320.   
  321. /** 
  322. * Sets "flash" data which will be available only in next request (then it will 
  323. * be deleted from session). You can use it to implement "Save succeeded" messages 
  324. * after redirect. 
  325. */ 
  326.   function set_flashdata($key$value
  327.   { 
  328.     $flash_key = $this->_flash_key.':new:'.$key
  329.     $this->set_userdata($flash_key$value); 
  330.   } 
  331.   
  332.   /** 
  333.    * Keeps existing "flash" data available to next request. 
  334.    */ 
  335.   function keep_flashdata($key
  336.   { 
  337.     $old_flash_key = $this->_flash_key.':old:'.$key
  338.     $value = $this->userdata($old_flash_key); 
  339.   
  340.     $new_flash_key = $this->_flash_key.':new:'.$key
  341.     $this->set_userdata($new_flash_key$value); 
  342.   } 
  343.   
  344.   /** 
  345.    * Returns "flash" data for the given key. 
  346.    */ 
  347.   function flashdata($key
  348.   { 
  349.     $flash_key = $this->_flash_key.':old:'.$key
  350.     return $this->userdata($flash_key); 
  351.   } 
  352.   
  353.   /** 
  354.    * PRIVATE: Internal method - marks "flash" session attributes as 'old' 
  355.    */ 
  356.   function _flashdata_mark() 
  357.   { 
  358.     foreach ($_SESSION as $name => $value
  359.       { 
  360.     $parts = explode(':new:'$name); 
  361.     if (is_array($parts) && count($parts) == 2) 
  362.       { 
  363.         $new_name = $this->_flash_key.':old:'.$parts[1]; 
  364.         $this->set_userdata($new_name$value); 
  365.         $this->unset_userdata($name); 
  366.       } 
  367.       } 
  368.   } 
  369.   
  370.   /** 
  371.    * PRIVATE: Internal method - removes "flash" session marked as 'old' 
  372.    */ 
  373.   function _flashdata_sweep() 
  374.   { 
  375.     foreach ($_SESSION as $name => $value
  376.       { 
  377.     $parts = explode(':old:'$name); 
  378.     if (is_array($parts) && count($parts) == 2 && $parts[0] == $this->_flash_key) 
  379.       { 
  380.         $this->unset_userdata($name); 
  381.       } 
  382.       } 
  383.   } 
  384.   
  385.   
  386.   
  387.   
  388.   /************* DATABASE METHODS ***************/ 
  389.   function _open() 
  390.   { 
  391.     if ($this->_sess_db = mysql_connect($this->object->db->hostname, 
  392.                     $this->object->db->username, 
  393.                     $this->object->db->password)) { 
  394.       return mysql_select_db($this->object->db->database, $this->_sess_db); 
  395.     } 
  396.      
  397.     return FALSE; 
  398.   } 
  399.   
  400.   function _close() 
  401.   { 
  402.     if ($this->_sess_db) { 
  403.       return mysql_close($this->_sess_db); 
  404.     } 
  405.   
  406.     return TRUE; 
  407.   } 
  408.    
  409.   function _read($id
  410.   { 
  411.     $id = mysql_real_escape_string($id); 
  412.      
  413.     $sql = "SELECT session_data FROM $this->_sess_table WHERE session_id = '$id'"
  414.      
  415.     if ($result = mysql_query($sql$this->_sess_db)) { 
  416.       if (mysql_num_rows($result)) { 
  417.     $record = mysql_fetch_assoc($result); 
  418.      
  419.     return $record['session_data']; 
  420.       } 
  421.     } 
  422.      
  423.     return ''
  424.   } 
  425.    
  426.   function _write($id$data
  427.   { 
  428.     $access = time(); 
  429.   
  430.     $id = mysql_real_escape_string($id); 
  431.     $access = mysql_real_escape_string($access); 
  432.     $data = mysql_real_escape_string($data); 
  433.      
  434.     $sql = "REPLACE INTO $this->_sess_table VALUES ('$id', '$access', '$data')"
  435.      
  436.     return mysql_query($sql$this->_sess_db); 
  437.   } 
  438.    
  439.   function _destroy($id
  440.   { 
  441.     $id = mysql_real_escape_string($id); 
  442.      
  443.     $sql = "DELETE FROM $this->_sess_table WHERE session_id = '$id'"
  444.   
  445.     return mysql_query($sql$this->_sess_db) or die("failed to delete<br>"); 
  446.   } 
  447.    
  448.   function _gc($max
  449.   { 
  450.     $old = time() - $max
  451.     $old = mysql_real_escape_string($old); 
  452.      
  453.     $sql = "DELETE FROM $this->_sess_table WHERE session_last_access < '$old'"
  454.      
  455.     return mysql_query($sql$this->_sess_db); 
  456.   } 
  457.   
  458.   

第五步:修改CI文件夹/system/application/config/autoload.php
加入自动装载类库database和session,类似以下配置

  1. $autoload['libraries'] = array('database','session'); 


这里主要介绍使用数据库存储session的方法,如果需要用文件型的session,只要简单的在CI的配置文件里设置:

  1. $config['sess_use_database']    = False; 

kndb session的wiki地址是:http://codeigniter.com/wiki/KNDB_Session/

下载地址


相关文章推荐

codeigniter兼容Session

  • 2013年12月25日 14:37
  • 3KB
  • 下载

CodeIgniter框架源码笔记(14)——SESSION之Mysql驱动实现

配置选项save_path用来作为表名。 存储Session的表结构如下:'id' => $session_id, 'ip_address' => $_SERVER['REMOTE_ADDR'], ...
  • soonfly
  • soonfly
  • 2016年08月25日 21:09
  • 819

CodeIgniter框架源码笔记(13)——SESSION之文件File驱动实现

CI的文件驱动要满足以下三个条件: 1、驱动要实现open ,read ,write ,close ,destory ,gc六个方法。 session_start()时,调用了open(),rea...
  • soonfly
  • soonfly
  • 2016年08月19日 08:59
  • 1362

php框架codeigniter中如何使用框架的session

里面有两种session的使用方法:1是php的原始的session使用方法,这个很简单,$_SESSION['name']="name",然后在需要的地方显示:echo $_SESSION['nam...
  • gayayzy
  • gayayzy
  • 2012年02月14日 15:08
  • 6112

CodeIgniter框架优化-Session支持SASL 用户名密码认证

CodeIgniter框架优化—Session驱动器支持SASL用户名密码认证前言:前段时间闲下来有点小空余时间,刚好需要部署CodeIgniter应用到集群服务器上面。新加了Session存储,同时...

codeigniter的session(1)

Session(会话)类可以让你保持一个用户的 "状态" ,并跟踪他在浏览你的网站时的活动。 CodeIgniter 自带了几个存储 session 的驱动: 文件(默认的,基...

CodeIgniter框架源码笔记(12)——SESSION类之临时数据TempData实现

Tempdata指的是一种带有有效时间的 session 数据, 当它的有效时间已过期,或在有效时间内被删除,都会自动被清除。 tempdata 也是常规的 session 变量,只不过以特殊的方式...
  • soonfly
  • soonfly
  • 2016年08月19日 08:31
  • 231

CodeIgniter框架源码笔记(15)——SESSION之Redis驱动实现

CodeIgniter框架源码笔记(14)——SESSION之Redis驱动实现session_start()时,调用了open(),read()方法。并有一定机率触发gc()方法。 session...
  • soonfly
  • soonfly
  • 2016年08月25日 21:21
  • 2146

[未解决]CodeIgniter调用session出错

A PHP Error was encountered Severity: Warning Message: mkdir(): Invalid path Filename: drivers/Sessi...

CodeIgniter学习笔记 Item1--CI简介与MVC设计模式

CodeIgniter的优势: 轻量级框架 出色的性能 广泛兼容标准主机上的各种PHP版本和配置 0配置 不需要使用命令行 不需坚守限制性编码规则 CodeIgniter最新版本的下载地址:http:...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:CodeIgniter kndb session 用法简介
举报原因:
原因补充:

(最多只允许输入30个字)