数据库处理session类
<?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类的更多相关文章
- Hibernate 系列 05 - Session 类
引导目录: Hibernate 系列教程 目录 前言: Session是Hibernate运作的中心,对象的生命周期.事务的管理.数据库的存取都与Session息息相关. 就如同在编写JDBC时需要关 ...
- redis/分布式文件存储系统/数据库 存储session,解决负载均衡集群中session不一致问题
先来说下session和cookie的异同 session和cookie不仅仅是一个存放在服务器端,一个存放在客户端那么笼统 session虽然存放在服务器端,但是也需要和客户端相互匹配,试想一个浏览 ...
- Session 类
Session 类 Session 类可以使用户在浏览您的网站时,维持他们的状态并跟踪他们的行为. Session 类将每个用户的 session 信息序列化(serialize)后存储到到 coo ...
- Hibernate中对象的三种状态以及Session类中saveOrUpdate方法与merge方法的区别
首先,用一张图说明一个对象,在Hibernate中,在调用了不同方法之后对象所处的不同状态 在Hibernate中,一个对象的状态可以被分为如图所示的三种 Transient:瞬时对象,该对象在数据库 ...
- python---定义一个session类(无错)
import tornado.web #放在内存 redis 文件 数据库 container={} #定义一个session类 class Session: def __init__(self,ha ...
- python---定义一个session类
首先:注意cookie中的get_cookie是返回字符串,而get_secure_cookie返回的是字节类型 #self.get_secure_cookie() #The decoded cook ...
- 数据库保存session
一般情况下,php.ini里的session.save_handler默认是file,也就是用文件来保存session,这种方式有几个缺点: 1.如果单靠session自己的垃圾回收机制,时间久了,保 ...
- Sql数据库帮组类
这段时间闲下来写了一些东西,重新写了一个简单的数据库帮组类 public class MyDBHelper { public static readonly string connString = C ...
- 如何使用数据库保存session的方法简介
使用数据库保存session的方法 php的session默认是以文件方式保存在服务器端,并且在客户端使用cookie保存变量,这就会出现一个问题,当一个用户由于某种安全原因关闭了浏览器的cookie ...
随机推荐
- 自制html
//$this->_red('账号或密码有误','/student/stureg/add'); echo '<meta http-equiv="Content-Type" ...
- Java面试(4)
1 哈希函数满足什么条件? 计算简单/散列地址分布均匀. 2 hash处理冲突方式?HashMap采用的什么办法? 开放地址法: 线性探测 . 线性补偿法.伪随机数法. 拉链法:HashMap采用链地 ...
- ansible安装配置zabbix客户端
安装软件 ansible host -m apt -a "name=zabbix-agent state=present" ansible host -m shell -a ...
- gevent异步,io自动切换
#!/usr/bin/env python # encoding: utf-8 # Date: 2018/6/19 # # from gevent import monkey # 这俩行必须放在首 ...
- oracle记录错误存储过程
CREATE OR REPLACE PROCEDURE SP_ERROR_LOGS_PRO(v_pro_name VARCHAR2, v_step_name VARCHAR2, v_date VARC ...
- **python中列表 元组 字典 集合
列表 元组 字典 集合的区别是python面试中最常见的一个问题.这个问题虽然很基础,但确实能反映出面试者的基础水平. 1.列表 列表是以方括号“[]”包围的数据集合,不同成员以“,”分隔. 列表的特 ...
- linux启动优化:mdev -s自从…
转载请说明出处:http://control.blog.sina.com.cn/admin/article/article_add.php 近期工作中遇到的问题如下: linux启动后加载根文件系统时 ...
- Bootstrap 概览
目录1.移动设备2.响应式图片3.Normalize4.Containers 1.移动设备在Bootstrap 3中,我们重写了整个框架,使其一开始就是对移动设备友好的.这次不是简单的增加一些可选的针 ...
- zookeeper更进一步(数据模型、watcher及shell命令)
ZooKeeper数据模型 ZooKeeper 的数据模型,在结构上和标准文件系统的非常相似,拥有一个层次的命名空间,都是采用树形层次结构,ZooKeeper 树中的每个节点被称为—Znode.和文件 ...
- Linux ping不通外网
在linux中ping www.baidu.com 无法ping通,可能原因是DNS没配置好 方法一: 修改vi /etc/resolv.conf 增加如下内容: nameserver 114.11 ...