php 自定义session

session句柄定义:
class SessionHandler{
private $_driver; //驱动
private $_gcMaxLifeTime=1440; //session生存周期
private $_gcProbability=5; //回收因子,不用每次执行session都执行垃圾回收机制,注意:回收因子越大,命中回收机率越大

public function __construct(){
//ini_set(‘session.gc_divisor‘,1);
$this->_driver = new MongoSession(); //数据库driver
session_set_save_handler(
array($this, ‘_open‘),
array($this, ‘_close‘),
array($this, ‘_read‘),
array($this, ‘_write‘),
array($this, ‘_destroy‘),
array($this, ‘_gc‘)
);

if(!isset($_COOKIE[‘PHPSESSID‘])){
session_start();
setcookie(‘PHPSESSID‘, session_id(), 0, ‘/‘ );
}else{
session_start();
}
}

public function _open($savePath,$sessionName){
//此是打开数据连接
//$this->_driver->open($savePath,$sessionName);
return true;
}

public function _close(){
//$this->_driver->close();
//关闭数据库连接
return true;
}

/**
* 读取session
* @param unknown_type $key session_id
*/
public function _read($key){
return $this->_driver->read($key);
}

/**
* 写入session
* @param unknown_type $key session_id
* @param unknown_type $value
*/
public function _write($key,$value){
$this->_driver->write($key,$value,$this->_gcMaxLifeTime);
}

/**
* 销毁session
* @param unknown_type $key //session_id
*/
public function _destroy($key){
$this->_driver->delete($key);
}

/**
* 回收session过期的垃圾数据
*/
public function _gc($gcTime){
//rand() 最大值32767
if((rand() % 100) < $this->_gcProbability){
$this->_driver->gc(time());
}
return true;
}

}

mongodb 驱动类:
class MongoSession{
/**
* 读取session
* @param unknown_type $sessionId
*/
public function read($sessionId){
//不执行判读过期时间
$ret = Db::init(‘session‘)->findOne(array(‘sessionId‘=>$sessionId));
return isset($ret[‘data‘]) ? $ret[‘data‘] : null;
}

/**
* 写入session
* @param unknown_type $sessionId
* @param unknown_type $data
* @param unknown_type $expire
*/
public function write($sessionId,$data,$expire=0){
//判断是否存在session了
$chk = Db::init(‘session‘)->findOne(array(‘sessionId‘=>$sessionId));
if($chk){
//存在更新
Db::init(‘session‘)->update(
array(‘sessionId‘=>$sessionId),
array(‘data‘=>$data,‘expire‘=>time()+$expire)
);
}else{
Db::init(‘session‘)->insert(array(
‘sessionId‘=>$sessionId,
‘data‘=>$data,
‘expire‘=>time()+$expire
));
}

}

/**
* 删除session
* @param unknown_type $sessionId
*/
public function delete($sessionId){
$ret = Db::init(‘session‘)->delete(array(‘sessionId‘=>$sessionId));
return $ret;
}

/**
* 回收
* @param unknown_type $expire
*/
public function gc($expire){
Db::init(‘session‘)->delete(array(‘expire‘=>array(‘$lt‘=>$expire)));
}

}

时间: 2024-10-12 08:58:22

php 自定义session的相关文章

Asp.net Mvc 自定义Session (一)

大家都知道用系统默认的session 会存在这样的问题 如果用户过多的话 session 会自动消亡,而且不能支持分布式和集群. 这系列博客主要讲解  怎样 解决用户过多的session自动消亡,和分布式集群 使用例子 Session["test"] = "啄木鸟"; 完全不改变系统的使用风格,可以直接升级系统:     在这里我们主要用的 HttpRuntime.cache 和 memcache. 希望读者这跟着我的思路,一步一步来设计自定义Session 首先,

使用 IntraWeb (40) - 自定义 Session 数据

修改 UserSessionUnit 单元: unit UserSessionUnit; interface uses IWUserSessionBase, SysUtils, Classes, IWApplication; type TIWUserSession = class(TIWUserSessionBase) procedure IWUserSessionBaseCreate(Sender: TObject); procedure IWUserSessionBaseDestroy(Se

监听器应用【统计网站人数、自定义session扫描器、踢人小案例】

从第一篇已经讲解过了监听器的基本概念,以及Servlet各种的监听器.这篇博文主要讲解的是监听器的应用. 统计网站在线人数 分析 我们在网站中一般使用Session来标识某用户是否登陆了,如果登陆了,就在Session域中保存相对应的属性.如果没有登陆,那么Session的属性就应该为空. 现在,我们想要统计的是网站的在线人数.我们应该这样做:我们监听是否有新的Session创建了,如果新创建了Sesssion,那么在线人数就应该+1.这个在线人数是整个站点的,所以应该有Context对象保存.

监听器实现案例----自定义session扫描器和统计在线用户人数及用户信息

一.案例一:自定义Session扫描器1.案例说明当一个Web应用创建的Session很多时,为了避免Session占用太多的内存,我们可以选择手动将这些内存中的session销毁,那么此时也可以借助监听器技术来实现.对于拿到 每个session 对象, 判断session的最后一次访问时间 与当前时间 的间隔是否超过 5 分钟, 如果超过就手动销毁 2.实现代码SessionScanner:session对象的监听器 MyTimerTask:定时器timer的任务对象 SessionScann

Tornado之自定义session

面向对象基础 面向对象中通过索引的方式访问对象,需要内部实现 __getitem__ .__delitem__.__setitem__方法 #!/usr/bin/env python # -*- coding:utf-8 -*- class Foo(object): def __getitem__(self, key): print '__getitem__',key def __setitem__(self, key, value): print '__setitem__',key,value

MongoDB实现ASP.NET 自定义Session

由来     由于HTTP协议是无状态的,客户端与服务器端进行"请求-响应"操作后,建立的连接就释放了,服务器端根本不知道刚才是哪个客户端访问的.但是有些场景是需要知道客户端的状态的,最典型的就是登陆问题,成功登陆后一段时间内就不需要再登陆.为了解决这个问题,服务器端引入了Session技术,它将会话状态保存在服务器端的技术. Session原理     当用户打开浏览器,请求某个网站的时候,服务器接收请求后,就会在内存中为该请求分配一个内存空间,这个内存空间就叫Session.一个S

python tornado 自定义session

python tornado 中需要自定session session原理: 1.客户端发送请求信息,服务端为用户端生成一个加密随机字符串random_str,然后将用户的信息作为这个随机字符串random_str的值,增加用户信息的安全性: 2.将random_str做为cookie写入给客户端,然后服务端进行判断用户携带cookie的情况 1 import tornado.web 2 import tornado.ioloop 3 4 class Session(): 5 def __ini

自定义Session

#!/usr/bin/env python import tornado.ioloop import tornado.web container = {} class Session: def __init__(self,handler): self.handler = handler self.random_str = None def __set_random_str(self): import hashlib import time obj = hashlib.md5 ( ) obj.up

自定义session过期时间

参考:http://www.jb51.net/article/52309.htm 在PHP中,设置php.ini,找到session.gc_maxlifetime = 1440 #(PHP5默认24分钟). 这里你可以随便设置一下过期时间.但是有人说设置以后,好象不起作用! 其实不是不起作用,而是因为系统默认: session.gc_probability = 1 session.gc_divisor = 1000 garbage collection 有个概率的,1/1000就是session