<?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. zabbix增加手机短信、邮件监控的注意要点,SSL邮件发送python脚本

    1.短信接口文档: URL http://xxx.com/interfaces/sendMsg.htm Method POST Description 文字短信调用接口 Request Param L ...

  2. Oracle linux 6.3 安装11g R2 RAC on vbox

    1 安装系统 Virtual box 4.3 Oracle linux 6.3 Oracle 11g r2 Make sure "Adapter 1" is enabled, se ...

  3. python's seventeenth day for me 面向对象

    用函数做一个简单的游戏: def Person(name,sex,hp,ad): self = {'name':name,'sex':sex,'hp':hp,'ad':ad} def attack(d ...

  4. temp8

  5. openGL 变换06

    变换 使用(多个)矩阵(Matrix) 对象可以更好的变换(Transform)一个物体. 向量 向量最基本的定义就是一个方向. 或者说 向量有一个方向(Direction)和大小(Magnitude ...

  6. Catch That Cow(bfs)

    Description Farmer John has been informed of the location of a fugitive cow and wants to catch her i ...

  7. linux中memset的正确用法

    linux中memset的正确用法 [起因]希望对各种类型的数组进行初始化,避免野值 [函数头文件] 提示:在linux中可以在terminal中输入 "man memset"进行 ...

  8. 04-nginx日志管理

    做了几年PHP,老板.经理没说让我管过日志这东西.一般牵涉到日志运维这主要是运维的工作.但是这一章节主要是以拔高性质为主.分析日志的管理方式.PHP程序员不能光靠PHP成为高手,PHP不就if els ...

  9. WEB前端--JavaScript

    JavaScript JavaScript基础 一.JavaScript简介 JavaScript是一种嵌入到HTML文件中的描述性语言,由浏览器的解释器将其动态地处理成可执行的代码,能独立地完成与客 ...

  10. Django----解决跨域

    cors(跨域资源共享): 本质设置响应头 定制中间件 cors.py 后在settings.py中间件中配置 from django.utils.deprecation import Middlew ...