数据库处理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 ...
随机推荐
- 微信小程序之if操作
.wxss控制样式 .price-agent{ font-size: 25rpx; color:#ababab; float: left; position: absolute; bottom: 0; ...
- php 语句块耗时性能测试
$t= microtime(true); ............................. echo microtime(true) - $t; 1查看从入口文件 ...
- java - 读取,导出 excel文件数据
首先需下载poi java包,添加至构建路径, 写处理方法: import java.io.FileInputStream;import java.io.FileOutputStream;import ...
- cacti启动有图无数据
cactiEZ服务器重启后,获取不到图形的解决办法 cd /var/www/html/cli/ php -q rebuild_poller_cache.php -d myisamchk --safe- ...
- linux启动优化:mdev -s自从…
转载请说明出处:http://control.blog.sina.com.cn/admin/article/article_add.php 近期工作中遇到的问题如下: linux启动后加载根文件系统时 ...
- Spring Data系列之Jpa(一)
1.Spring Data的由来 Spring Data是SpringSource基金会创下的一个简化数据库访问.支持云服务的开源框架.其主要目的是让数据库访问变的方便快捷,可以用Spring Dat ...
- java Web 过滤器Filter详解
简介 Filter也称之为过滤器,Web开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊 ...
- linux su su -
本人以前一直习惯直接使用root,很少使用su,前几天才发现su与su -命令是有着本质区别的! 大部分Linux发行版的默认账户是普通用户,而更改系统文件或者执行某些命令,需要root身份才能进行, ...
- 【codevs2822】爱在心中
题目描述 Description “每个人都拥有一个梦,即使彼此不相同,能够与你分享,无论失败成功都会感动.爱因为在心中,平凡而不平庸,世界就像迷宫,却又让我们此刻相逢Our Home.” 在爱的国度 ...
- linux下rsync命令详细整理
点评:rsync是一个功能非常强大的工具,其命令也有很多功能特色选项,我们下面就对它的选项一一详细说明,需要了解的朋友可以参考下-在对rsync服务器配置结束以后,下一步就需要在客户端发出rsync命 ...