最近在学习高级会话:
一、学习了用cookie模拟用户登录注册退出流程,信息写入$_COOKIE数组,依赖于客户端浏览器,安全性也低
二、又学习了session模拟用户登录注册退出流程,信息写入$_SESSION数组,保存在服务器端。
但是基于session技术:又有多种方式,
1)基于cookie的,让客户端浏览器用cookie方式记住session_id,实现
2)基于url的,让地址栏上每一刻都记录着session_id,(可以用变量记住,也可以用SID,也是多种方式),即客户浏览器禁用cookie的情况下。
三、再有就是session服务器端的管理
主要就是围绕这个扩展在动 session.save_handler = files/user/memcache
1)保存到文件,可以是系统默认的方式,不用改配置文件任何地方。也可以是自定义的(上面改成user),重写session.save_handler(其中又包含6个方法)
2)保存到数据库中。上面的配置改成user,重写session.save_handler(其中又包含6个方法)
3)保存到memcache中,这种是最快最优的保存方式,同上,配置改成user,重写session.save_handler(其中又包含6个方法)
保存到memcache这种情况,也可以用系统自带的,需要改配置:
session.save_handler = memcache
session.save_path = "tcp://localhost:11211" ;这个地方写成这样就是直接写入memcache数据库,多个服务器,用逗号隔开
然后,这种情况就不用重写session.save_handler了。
上面的这三种方式,本博客里,都有实现,可以看看相关内容。
这篇是将session信息保存到memcache中,session.save_handler = user 的情况。 初学者,问题可能还有很多,多多指出。
<?php
/***
将信息写入到Memcache中管理
***/
class MemSession {
private static $handler = null; //数据库连接
private static $lifetime = null; //垃圾回收时间
private static $time = null; //当前时间
const NS ='session_'; //
//初始化,给变量附上值
private static function init($handler){
self::$handler = $handler;
self::$lifetime = ini_get('session.gc_maxlifetime');
self::$time=time();
}
public static function start(Memcache $memcache){
self::init($memcache);
session_set_save_handler( //回调函数
array(__CLASS__,'open'), //调用本类的open方法
array(__CLASS__,'close'),
array(__CLASS__,'read'),
array(__CLASS__,'write'),
array(__CLASS__,'destroy'),
array(__CLASS__,'gc')
);
session_start();
}
public static function open($path,$name){
return true;
}
public static function close(){
return true;
}
//从memcache中读取
public static function read($PHPSESSID){
$out=self::$handler->get(self::session_key($PHPSESSID));
if($out === false || $out == null)
return '';
return $out;
}
//写入memcache中
public static function write($PHPSESSID,$data){
$method =$data?'set':'replace';
return self::$handler->$method(self::session_key($PHPSESSID),$data,MEMCACHE_COMPRESSED,self::$lifetime);
}
public static function destroy($PHPSESSID){
return self::$handler->delete(self::session_key($PHPSESSID));
}
public static function gc($lifetime){
return true;
}
//拼凑session_id,在前面加上前缀
public static function session_key($PHPSESSID){
$session_key = self::NS.$PHPSESSID ; //设置session键
return $session_key;
}
}
$memcache = new Memcache();
//连接mem数据库
$memcache->connect('localhost',11211) or exit("could not connect!");
//开启服务
MemSession::start($memcache);
?>