1、将PHP的配制文件PHP.ini中session.save_handler="files"改写为session.save_handler="user";
2、创建数据库数据表;
3、添加如下类文件,并定义open、read、write、close、destory、gc等方法;
class FileSessionHandler {
//put your code here
public $lifetime = 1800; // 有效期,单位:秒(s),默认30分钟
public function __construct() {
session_set_save_handler(
array(&$this, 'open'), // 在运行session_start()时执行
array(&$this, 'close'), // 在脚本执行完成 或 调用session_write_close() 或 session_destroy()时被执行,即在所有session操作完后被执行
array(&$this, 'read'), // 在运行session_start()时执行,因为在session_start时,会去read当前session数据
array(&$this, 'write'), // 此方法在脚本结束和使用session_write_close()强制提交SESSION数据时执行
array(&$this, 'destroy'), // 在运行session_destroy()时执行
array(&$this, 'gc') // 执行概率由session.gc_probability 和 session.gc_divisor的值决定,时机是在open,read之后,session_start会相继执行open,read和gc
);
register_shutdown_function('session_write_close');//这一行必须写在session_start之前
session_start(); // 这也是必须的,打开session,必须在session_set_save_handler后面执行
}
public function open($save_path='',$sesssion_name='') {
return TRUE;
}
public function read($session_id) {
$res = M('Session')->where(['session_id'=>$session_id])->find();
if($res){
return $res['session_str'];
}
return '';
}
public function write($session_id,$data) {
$add_data = array(
'session_id'=>$session_id,
'session_str'=>$data,
'upd'=> time()
);
$info = M('Session')->where(['session_id'=>$session_id])->find();
if(!$info){
M('Session')->add($add_data);
return ;
} else {
M('Session')->save($add_data);
return;
}
}
public function close() {
return $this->gc($this->lifetime);
}
public function destroy($session_id) {
return M('Session')->where(['session_id'=>$session_id])->delete();
}
public function gc($life_time) {
$expire_time = time()->$life_time;
$map['upd'] = array('lt',$expire_time);
return M('Session')->where($map)->delete();
}
4、调用方法(不能用tp框架封装的session()方法,必须用原生的$_SESSION)
public function tt_test() {
$handler = new FileSessionHandler();
$_SESSION['user']="asdasdasdasd";
dump($_SESSION);
}