关闭

PHP改写session到数据库

发表于:2015-12-28 10:18

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:自由无风    来源:51Testing软件测试网采编

  session改写mysql
  在调用 session_start();的地方改用实例化本类即可new SessionDB();
session_set_save_handler(
array($this, 'userSessionBegin'),
array($this, 'userSessionEnd'),
array($this, 'userSessionRead'),
array($this, 'userSessionWrite'),
array($this, 'userSessionDelete'),
array($this, 'userSessionGC')
);如果是类里要这样写,因为要明确是哪个类的方法如果在类外可以这样写
session_set_save_handler(
'userSessionBegin',
'userSessionEnd',
'userSessionRead',
'userSessionWrite',
'userSessionDelete',
'userSessionGC')
<?php
/**
* session入库工具类
*/
class SessionDB {
private $_dao;
public function __construct() {
//设置session处理器
ini_set('session.save_handler', 'user');
session_set_save_handler(
array($this, 'userSessionBegin'),
array($this, 'userSessionEnd'),
array($this, 'userSessionRead'),
array($this, 'userSessionWrite'),
array($this, 'userSessionDelete'),
array($this, 'userSessionGC')
);
//开启
session_start();
}
function userSessionBegin() {
//初始化DAO
$config = array('host' => '127.0.0.1',    'port' => '3306', 'username'=>'shop34', 'password' => '1234abcd', 'charset'=>'utf8', 'dbname'=>'shop34');
$this->_dao = MySQLDB::getInstance($config);
}
function userSessionEnd() {
return true;
}
/**
* 读操作
* 执行时机:    session机制开启程中执行
* 工作:        从当前session数据区读取内容
* @param $sess_id string
* @return string
*/
function userSessionRead($sess_id) {
//查询
$sql = "SELECT session_content FROM `p34_session` WHERE session_id='$sess_id'";
return (string) $this->_dao->getOne($sql);
}
/**
* 写操作
* 执行时机:    脚本周期结束时,PHP在整理收尾时
* 工作:        将当前脚本处理好的session数据,持久化存储到数据库中!
* @param $sess_id string
* @param $sess_content string 序列化好的session内容字符串
* @return bool
*/
function userSessionWrite($sess_id, $sess_content) {
// 完成写
$sql = "REPLACE INTO `p34_session` VALUES ('$sess_id', '$sess_content', unix_timestamp())";
return $this->_dao->query($sql);
}
/**
* 删除操作
* 执行时机:    调用了session_destroy()销毁session过程中被调用
* 工作:        删除当前session的数据区(记录
* @param $sess_id string
* @return bool
*/
function userSessionDelete($sess_id) {
//删除
$sql = "DELETE FROM `p34_session` WHERE session_id='$sess_id'";
return $this->_dao->query($sql);
}
/**
* 垃圾回收操作
* 执行时机:    开启session机制时,有概率的执行
* 工作:        删除那些过期的session数据区
* @param $max_lifetime
* @return bool
*/
function userSessionGC($max_lifetime) {
//删除
$sql = "DELETE FROM `p34_session` WHERE last_time<unix_timestamp()-$max_lifetime";
return $this->_dao->query($sql);
}
}
  gc回收器调用次数改写
  ini_set('session.gc_probability', '1');
  ini_set('session.gc_divisor', '3');
  //session.gc_divisor 与 session.gc_probability 合起来定义了在每个会话初始化时启动 gc(garbage collection 垃圾回收)进程的概率。此概率用 gc_probability/gc_divisor 计算得来。例如 1/100 意味着在每个请求中有 1% 的概率启动 gc 进程。session.gc_divisor 默认为 100。
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号