<?php
/*
* 使用数据库处理session
* php.ini 中 session.save_handler 设为 "user"
*/
class Dbsession{
private static $ua; //代理浏览器
private static $ip; //IP地址
private static $lifetime;//session生存时间
private static $time; //当前时间
private static $pdo; public static function start(PDO $pdo){
self::$pdo = $pdo;
self::$ua = isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : ''; if ( !empty( $_SERVER['HTTP_CLIENT_IP'] ) ) { //check ip from share internet
self::$ip = $_SERVER['HTTP_CLIENT_IP'];
} else if ( !empty( $_SERVER['HTTP_X_FORWARDED_FOR'] ) ) {
self::$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
} else {
self::$ip = $_SERVER['REMOTE_ADDR'];
}
filter_var(self::$ip,FILTER_VALIDATE_IP) === FALSE && self::$ip = 'unknown';
self::$lifetime = ini_get("session.gc_maxlifetime");
self::$time = time(); session_set_save_handler(
array(__CLASS__,'open'),
array(__CLASS__,'close'),
array(__CLASS__,'read'),
array(__CLASS__,'write'),
array(__CLASS__,'destroy'),
array(__CLASS__,'gc')
); session_start();
} private static function open($path,$name){
return true;
} public static function close(){
return true;
} private static function read($sid){
$sql = "select * from session where sid=?";
$st = self::$pdo->prepare($sql);
$st->execute(array($sid));
//没有数据
if(!$result = $st->fetch(PDO::FETCH_ASSOC)){
return '';
}
//用户更换了浏览器或者IP地址
if($result['ua'] != self::$ua || $result['ip'] != self::$ip){
self::destroy($sid);
return '';
}
//时间过期
if($result['updatetime']+self::$lifetime < self::$time){
self::destroy($sid);
return '';
} return $result['data']; //返回session数据 } public static function write($sid,$data){
//先查有无session
$sql = "select * from session where sid=?";
$st = self::$pdo->prepare($sql);
$st->execute(array($sid));
if($result = $st->fetch(PDO::FETCH_ASSOC)){
//数据发生改变或者30秒开外,则更新
if($result['data'] != $data || $result['updatetime']+30 < self::$time){
$sql = "update session set data=? ,updatetime=? where sid=?";
$st = self::$pdo->prepare($sql);
$st->execute(array($data,self::$time,$sid));
}
}else{
if(!empty($data)){
$sql = "insert into session values(?,?,?,?,?)";
$st = self::$pdo->prepare($sql);
$st->execute(array($sid,$data,self::$time,self::$ua,self::$ip));
}
}
return true;
} public static function destroy($sid){
$sql = "delete from session where sid=?";
$st = self::$pdo->prepare($sql);
$st->execute(array($sid));
return true;
} private static function gc($lifetime){
$sql = "delete from session where updatetime<?";
$st = self::$pdo->prepare($sql);
$st->execute(array(self::$time-$lifetime));
return true;
}
}

数据库处理session类的更多相关文章

  1. Hibernate 系列 05 - Session 类

    引导目录: Hibernate 系列教程 目录 前言: Session是Hibernate运作的中心,对象的生命周期.事务的管理.数据库的存取都与Session息息相关. 就如同在编写JDBC时需要关 ...

  2. redis/分布式文件存储系统/数据库 存储session,解决负载均衡集群中session不一致问题

    先来说下session和cookie的异同 session和cookie不仅仅是一个存放在服务器端,一个存放在客户端那么笼统 session虽然存放在服务器端,但是也需要和客户端相互匹配,试想一个浏览 ...

  3. Session 类

     Session 类 Session 类可以使用户在浏览您的网站时,维持他们的状态并跟踪他们的行为. Session 类将每个用户的 session 信息序列化(serialize)后存储到到 coo ...

  4. Hibernate中对象的三种状态以及Session类中saveOrUpdate方法与merge方法的区别

    首先,用一张图说明一个对象,在Hibernate中,在调用了不同方法之后对象所处的不同状态 在Hibernate中,一个对象的状态可以被分为如图所示的三种 Transient:瞬时对象,该对象在数据库 ...

  5. python---定义一个session类(无错)

    import tornado.web #放在内存 redis 文件 数据库 container={} #定义一个session类 class Session: def __init__(self,ha ...

  6. python---定义一个session类

    首先:注意cookie中的get_cookie是返回字符串,而get_secure_cookie返回的是字节类型 #self.get_secure_cookie() #The decoded cook ...

  7. 数据库保存session

    一般情况下,php.ini里的session.save_handler默认是file,也就是用文件来保存session,这种方式有几个缺点: 1.如果单靠session自己的垃圾回收机制,时间久了,保 ...

  8. Sql数据库帮组类

    这段时间闲下来写了一些东西,重新写了一个简单的数据库帮组类 public class MyDBHelper { public static readonly string connString = C ...

  9. 如何使用数据库保存session的方法简介

    使用数据库保存session的方法 php的session默认是以文件方式保存在服务器端,并且在客户端使用cookie保存变量,这就会出现一个问题,当一个用户由于某种安全原因关闭了浏览器的cookie ...

随机推荐

  1. 1134 Vertex Cover

    题意:给出一个图和k个查询,每个查询给出Nv个结点,问与这些结点相关的边是否包含了整个图的所有边. 思路:首先,因为结点数较多,用邻接表存储图,并用unordered_map<int,unord ...

  2. 腾讯云搭建php环境

    1.安装搭建论坛必要的软件 apache  php  mysql CentOS系统我们可以直接使用 yum install 的方式进行软件安装,腾讯云有提供软件安装源,是同步CentOS官方的安装源, ...

  3. springboot成神之——swagger文档自动生成工具

    本文讲解如何在spring-boot中使用swagger文档自动生成工具 目录结构 说明 依赖 SwaggerConfig 开启api界面 JSR 303注释信息 Swagger核心注释 User T ...

  4. Python3.x 常用的新特性

    Python3.x 常用的新特性 print() 是函数,不是一个语句 raw_input()输入函数,改为 input() Python 3 对文本和二进制数据做了更为清晰的区分. 文本由unico ...

  5. Python函数的初识

    一   什么是函数 定义: 定义一个事情或者功能,等到需要用的时候直接用就可以了,那么这个定义的就是一个函数 函数  :  对代码块和功能的封装和定义 函数定义的格式:     def   函数名() ...

  6. Oracle11gR2_ADG管理之resinstate实战

    主库上打开闪回 SQL> select flashback_on from v$database; FLASHBACK_ON ------------------ YES 模拟断电 SQL> ...

  7. Mycat实战之主键数据库自增方式

    创建一个 person表,主键为Id,hash方式分片,主键自增(采用数据库方式) #person表结构如下 Id,主键,Mycat自增主键 name,字符串,16字节最长 school,毕业学校,数 ...

  8. ocx控件针对网页刷新和关闭分别进行区分处理

    当ocx加载在网页上时,如果对网页执行F5刷新事件,ocx控件会销毁ocx的窗口类,但是ocx的APP类是不会销毁的. 只有当网页被关闭时,才销毁app类. --------------------- ...

  9. Python模块及其导入

    一.模块 1.模块的定义: 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相对较少, 很多编程语言都采用这种组织代码的方式.在Python中,一个.py文件 ...

  10. 读书笔记 Week5 2018-4-5

    再结束了第一个个人任务以后,我也算有点时间翻开一本大部头来通读一下.在看了一些相关的评论说:“该书可以从任意章节读起”后,刚刚在180M测试文件的个人任务中吃了亏的我,决定从他的第5部分,代码改善看起 ...