将Session保存到Memcache的实现方法及代码

发布时间:2020-03-17编辑:脚本学堂
大数据量环境下使用基于文件的session存取瓶颈可能都是在磁盘IO 操作上,此时可以考虑使用memcached来保存session数据,直接通过内存的方式,效率要高很多。

使用memcache保存sesion,在读写速度上会比files方式快很多,也便于多服务器的session共享,将这些服务器都配置成使用同一组memcached服务器即可。

不过,这种方法也有缺点:由于session数据以内存方式保存,如果当机或重启,session将全部丢失。

复制代码 代码示例:

<?php
/**
  @session保存进memcache
  @site http://www.jb200.com
*/
class MS{
    static $mem;
    static $maxtime;
 
    function __construct($mem){
      self::$mem = $mem;
      self::$maxtime = ini_get('session.gc_maxlifetime');
      session_module_name('user');//session文件保存方式,这个是必须的!除非在Php.ini文件中设置了

      session_set_save_handler(
         array(__CLASS__,'open'),//在运行session_start()时执行
         array(__CLASS__,'close'),//在脚本执行完成或调用session_write_close() 或 session_destroy()时被执行,即在所有session操作完后被执行
         array(__CLASS__,'read'),//在运行session_start()时执行,因为在session_start时,会去read当前session数据
         array(__CLASS__,'write'),//此方法在脚本结束和使用session_write_close()强制提交SESSION数据时执行
         array(__CLASS__,'destroy'),//在运行session_destroy()时执行
         array(__CLASS__,'gc')//执行概率由session.gc_probability 和 session.gc_divisor的值决定,时机是在open,read之后,session_start会相继执行open,read和gc
      );
      session_start();//这也是必须的,打开session,必须在session_set_save_handler后面执行
   }
 
   static function open($sid){
      return true;
   }
   static function close(){
      return true;
   }
 
   static function read($sid){
      return self::$mem->get($sid);
   }
 
 
   function write($sid,$data){
      return self::$mem->set($sid,$data,MEMCACHE_COMPRESsed,self::$maxtime);
   }
 
   function destroy($sid){
      return self::$mem->delete($sid);
   }
 
   function gc($maxtime){
      return true;
   }
}

//调用示例
$mem=new Memcache();
$mem->connect('127.0.0.1', '11211');
$session=new MS($mem);
$_SESSION['007']='www.jb200.com';

//session_destroy();
echo $_SESSION['007'];
var_dump($mem->get('i3pa9v2usiem3svj0ga4apvbc3'));
?>