php改写session到数据库

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。
时间: 2024-12-28 00:25:42

php改写session到数据库的相关文章

PHP操纵session存入数据库

1 为什么需要session入库 当session中数据很多时,或者web服务器集群共享session时,就需要将session存入数据库 session存入数据库一般是要重写session存储机制,具体实现主要通过: a  自定义相关session函数 b  创建session表 c  重写session函数 数据表如下: 在session.php中重写存储机制 在其他php文件中引入session.php,就可以操作session存入数据库了 查询操作如下:

将Session写入数据库

使用session_set_save_handler()函数,将Session的内容写入数据库 1 <?php 2 /* 3 *@author Fahy 4 *@link http://home.cnblogs.com/u/HuangWj 5 *数据库为mysql, 6 *数据库名为session,表名为session, 7 *表中字段包括PHPSESSID,update_time,client_ip,data 8 */ 9 class Session{ 10 private static $h

session放数据库里解决丢失的问题

在编程里是会话的意思Session 对象存储特定用户会话所需的信息.这样,当用户在应用程序的 Web 页之间跳转时,存储在 Session 对象中的变量将不会丢失,而是在整个用户会话中一直存在下去. 当用户请求来自应用程序的 Web 页时,如果该用户还没有会话,则 Web 服务器将自动创建一个 Session 对象.当会话过期或被放弃后,服务器将终止该会话. Session 对象最常见的一个用法就是存储用户的首选项.例如,如果用户指明不喜欢查看图形,就可以将该信息存储在 Session 对象中.

将session存入数据库,memcache的方法

//存入数据库 <?phpif(!$con = mysql_connect('localhost','root','123456')){    die('连接数据库失败');}$link = mysql_select_db('session');//session入库function open($save_path,$session_name){    return true;}function close(){    }function read($id){    //查询的sql语句    

php session存数据库

这个sesison存到数据库很简单,就是根据session_id进行对数据库的CRUD操作,主要是用到了,session_set_save_handler这个方法,自定义session的执行方法, 首先创建数据表 CREATE TABLE `sessions` ( `session_id` varchar(255) NOT NULL, `session_expires` int(11) DEFAULT NULL, `session_data` text, PRIMARY KEY (`sessio

redis作为cache和session的数据库的使用

package main import ( _ "./routers" "fmt" "github.com/astaxie/beego" _ "github.com/astaxie/beego/cache/redis" "github.com/astaxie/beego/cache" "log" "time" ) type hashes struct { name s

session写入数据库

1 <?php 2 class session 3 { 4 private static $handle = null; 5 private static $ip = null; 6 private static $lifetime = null; 7 private static $time = null; 8 9 static function init($pdo) 10 { 11 self::$handle = $pdo; 12 self::$ip = !empty($_SERVER[&quo

利用hibernate的session查询数据库,并且在jsp页面显示表内容的方法

试过了很多种方法都没有成功,终于让我找到了这种方法! 首先在后台写代码: Transaction tx = session.beginTransaction(); List list = session.createSQLQuery("select * from jike").list(); tx.commit(); List list1 = new ArrayList(); Iterator it = list.iterator(); while(it.hasNext()){ Jik

ThinkPHP - session 数据库存储驱动

命名格式: Session + 驱动名称 + .class.php 所有的方法要有,但不一定要实现. <?php /** * @category Extend * @package Extend * @subpackage Driver.Session * @author liu21st <[email protected]> */ class SessionDb { /** * Session有效时间 */ protected $lifeTime = ''; /** * session