ShadowWalker 发表于 2014-8-14 15:43:20

一个文件解决CI支持Session存储到memcache

将此文件放到自己的类库里,就相当于重写了Session.php类。

MY_Session.php


<?php defined('BASEPATH') OR exit('No direct script access allowed');


new Session_Memcache;
session_start();
Class MY_Session Extends CI_Session
{


/**
* Fetch the current session data if it exists
*
* @access public
* @return bool
*/
public function sess_read()
{
$this->userdata = $_SESSION;

return TRUE;
}

/**
* Write the session data
*
* @access public
* @return void
*/
public function sess_write()
{
$_SESSION = array();
foreach($this->userdata as $key => $val)
{
   $_SESSION[$key] = $val;
}
}

/**
* Create a new session
*
* @access public
* @return void
*/
public function sess_create()
{
if(session_id() == '')
{
   session_start();
}
$this->userdata = $_SESSION;
}

/**
* Update an existing session
*
* @access public
* @return void
*/
public function sess_update()
{
$_SESSION = array();
foreach($this->userdata as $key => $val)
{
   $_SESSION[$key] = $val;
}

}

/**
* Destroy the current session
*
* @access public
* @return void
*/
public function sess_destroy($destroy = TRUE)
{
session_unset();
}


/**
* Does nothing for native sessions
*
* @access public
* @return void
*/
public function _sess_gc(){


}
}

class Session_Memcache
{
public $CI = '';



/**
+----------------------------------------------------------
* Session有效时间
+----------------------------------------------------------
*/
protected $lifeTime='';


/**
+----------------------------------------------------------
* memcache句柄
+----------------------------------------------------------
*/
protected static $hander;


public $_memcache_conf = '';


function __construct(){

$this->CI =& get_instance();
ini_set('session.cookie_path',$this->CI->config->item('cookie_path'));
ini_set('session.cookie_domain',$this->CI->config->item('cookie_domain'));
ini_set('session.cookie_lifetime', $this->CI->config->item('cookie_lifetime'));
$this->lifeTime = $this->CI->config->item('cookie_lifetime');
$this->execute();
}



/**
+----------------------------------------------------------
* 打开Session
+----------------------------------------------------------
* @access public
+----------------------------------------------------------
* @param string $savePath
* @param mixed $sessName
+----------------------------------------------------------
*/
public function open($savePath, $sessName) {



$CI =& get_instance();
if ($CI->config->load('memcached', TRUE, TRUE))
{
   if (is_array($CI->config->config['memcached']))
   {
    $this->_memcache_conf = NULL;

    foreach ($CI->config->config['memcached'] as $name => $conf)
    {
   $this->_memcache_conf[$name] = $conf;
    }
   }
}

$memcache = new memcache();


foreach ($this->_memcache_conf as $name => $cache_server)
{
   if ( ! array_key_exists('hostname', $cache_server))
   {
    $cache_server['hostname'] = $this->_default_options['default_host'];
   }

   if ( ! array_key_exists('port', $cache_server))
   {
    $cache_server['port'] = $this->_default_options['default_port'];
   }

   if ( ! array_key_exists('weight', $cache_server))
   {
    $cache_server['weight'] = $this->_default_options['default_weight'];
   }

   
   $hander = $memcache->addServer(
   $cache_server['hostname'], $cache_server['port'], $cache_server['weight']
   );
}

if(!$hander || !$memcache){
   
   return false;
}


self::$hander = $memcache;

return true;
}


/**
+----------------------------------------------------------
* 关闭Session
+----------------------------------------------------------
* @access public
+----------------------------------------------------------
*/
public function close() {
returnself::$hander->close();
}

/**
+----------------------------------------------------------
* 读取Session
+----------------------------------------------------------
* @access public
+----------------------------------------------------------
* @param string $sessID
+----------------------------------------------------------
*/
public function read($sessID) {
$data =self::$hander->get($sessID);
if(!empty($data)){
   return $data;
}
return '';
}

/**
+----------------------------------------------------------
* 写入Session
+----------------------------------------------------------
* @access public
+----------------------------------------------------------
* @param string $sessID
* @param String $sessData
+----------------------------------------------------------
*/
public function write($sessID,$sessData) {

if(!$sessData){
   return false;
}

$result = self::$hander->set($sessID,$sessData,0,$this->lifeTime);
if($result){
   return true;
}
return false;
}

/**
+----------------------------------------------------------
* 删除Session
+----------------------------------------------------------
* @access public
+----------------------------------------------------------
* @param string $sessID
+----------------------------------------------------------
*/
public function destroy($sessID) {
$result = self::$hander->delete($sessID);
if($result){
   return true;
}
return false;
}

/**
+----------------------------------------------------------
* Session 垃圾回收
+----------------------------------------------------------
* @access public
+----------------------------------------------------------
* @param string $sessMaxLifeTime
+----------------------------------------------------------
*/
public function gc($sessMaxLifeTime) {
return true;
}

/**
+----------------------------------------------------------
* 打开Session
+----------------------------------------------------------
* @access public
+----------------------------------------------------------
* @param string $savePath
* @param mixed $sessName
+----------------------------------------------------------
*/
public function execute() {
session_set_save_handler(array(&$this,"open"),
array(&$this,"close"),
array(&$this,"read"),
array(&$this,"write"),
array(&$this,"destroy"),
array(&$this,"gc"));

}
}



然后在config目录下创建一个名字叫做memcached.php的文件,把下面代码贴进去即可。


<?php
// Memcache 配置
if (! defined ( 'BASEPATH' )){
    exit ( 'No direct script access allowed' );
}
$config ['memcached'] = array (
    'hostname' => '192.168.1.54',
    'port' => 11211,
    'weight' => 1
);




代码虽然写的很潦草,但是很实用,大家发现什么问题 请在此帖下方提出!谢谢



页: [1]
查看完整版本: 一个文件解决CI支持Session存储到memcache