我们知道,session是一种会话技术,用来实现跨脚本共享数据。

在之前的php会话技术中我们介绍过,session是存放在服务器端的文件里的,因此session有可能因为文件数量过多,会在查询session文件以及读取的时候产生压力。一般我们有三种解决方案

1.使用文件分层(缺点:I/O操作是系统的一个瓶颈,即使分层也不能避免此问题)

2.将session放入数据库

3.将session放在内存中(非关系性数据库)(缺点:对服务器内存要求教高)

因此我们选用一个折中的办法,将session存入mysql数据库,也就是我们要讲的重点,

session入库技术:

要实现session入库,首先我们要了解session 机制:

什么是session机制:

在php中,session可以理解为一套单独的小系统,在该系统中有很多关于session的处理方法,用来解决各种问题,用户只需要在session之外,调用session_start函数(session系统的一个接口)

其他操作都是session系统帮忙去处理

由图可知我们应该修改session机制中的session的读取和最终的写入。
要修改session机制要借助一个系统函数
session_set_save_handler():用来使用外部用户定义的函数,来取代session系统本身的函数。
session_set_save_handler(开启session机制函数,关闭session机制函数,读取session数据函数,写入session函数,销毁session函数,后手过期session函数)。
因此我们要准备六个函数。
代码实现:
<?php
    //session入库
    //以为修改session机制必须借助session_set_save_handler()函数,该函数需要6个可以调用的回调函数,因此需要创建6个人对应的函数
    //1.开启session机制
    function sess_open()
    {
        //开启资源
        //连接数据库
        mysql_connect('localhost','root','');
        mysql_query('set names utf8');
        mysql_query('use session');

echo __FUNCTION__,'<br/>';
    }
    //2.关闭session
        function sess_close()
    {
        //关闭资源
        mysql_close();
        echo __FUNCTION__,'<br/>';
    }
    //3.读取session
    function sess_read($sess_id)
    {
        //从数据库读取数据
        //根据sess_id(由系统提供)获取数据
        //读数据时要过滤掉过期的数据
        $expire=time()-ini_get('session.gc_maxlifetime');
        $sql="selsct * from session where sess_id='{$sess_id}' and sess_expire>='{$expire}'";
        $res=mysql_query($sql);
        //得到的是一个数组
        if($sess=@mysql_fetch_assoc($res))
        {
            //得到一个序列化后的字符串
            //要进行反序列化,read只负责读取数据,不负责加工数据
            return $sess['sess_info'];
        }
        echo __FUNCTION__,'<br/>';
    }
    //4.写入session
    function sess_write($sess_id,$sess_info)
    {
        //向数据库中写入数据
        $time=time();
        $sql="replace into session values('{$sess_id}','{$sess_info}','{$time}')";
        mysql_query($sql);
        echo __FUNCTION__,'<br/>';
    }
    //5.销毁session
    function sess_destroy($sess_id)
    {
        
        $sql="delete from session where sess_id='{$sess_id}'";
        return mysql_query($sql);
        echo __FUNCTION__,'<br/>';
    }
    //6.回收session
    function sess_gc()
    {
        //从数据库删除过期的session数据
        //判断session是否过期,过期的删除
        $expire=ini_get('session.gc_maxlifetime');
        //得到最迟的时间,在$expire之前的都是过期的
        $expire=time()-$expire;
        $sql="delete from session where sess_expire < '{expire}'";
        return mysql_query($sql);
        echo __FUNCTION__,'<br/>';
    }

//使用session_set_save_handler()修改session机制
    session_set_save_handler('sess_open','sess_close','sess_read','sess_write','sess_destroy','sess_gc');
    //想要使用session,必须要用session_start()来开启
    session_start();
    $_SESSION['name']='wangqixing';
    $_SESSION['age']='23';
    //session_destroy();

session高级(session入库)的更多相关文章

  1. 懒加载session 无法打开 no session or session was closed 解决办法(完美解决)

           首先说明一下,hibernate的延迟加载特性(lazy).所谓的延迟加载就是当真正需要查询数据时才执行数据加载操作.因为hibernate当中支持实体对象,外键会与实体对象关联起来.如 ...

  2. PHP自带Session隐患(session文件独占锁引起阻塞)

    PHP自带Session隐患(session文件独占锁引起阻塞) PHP默认的会话处理器是session.save_handler = files(即文件).如果同一个客户端同时并发发送多个请求(如a ...

  3. PHP session有效期session.gc_maxlifetime的设置方法

    PHP(外文名: Hypertext Preprocessor,中文名:“超文本预处理器”)是一种通用开源脚本语言.语法吸收了C语言.Java和Perl的特点,入门门槛较低,易于学习,使用广泛,主要适 ...

  4. hibernate 管理 Session(单独使用session,不spring)

    Hibernate 本身提供了三个管理 Session 对象的方法 Session 对象的生命周期与本地线程绑定 Session 对象的生命周期与 JTA 事务绑定 Hibernate 托付程序管理 ...

  5. ASP.NET Web Service中使用Session 及 Session丢失解决方法 续

    原文:ASP.NET Web Service中使用Session 及 Session丢失解决方法 续 1.关于Session丢失问题的说明汇总,参考这里 2.在Web Servcie中使用Sessio ...

  6. org.hibernate.LazyInitializationException...no session or session was closed

    org.hibernate.LazyInitializationException:failed to lazily initialize a collection of role:cn.its.oa ...

  7. Apache shiro集群实现 (六)分布式集群系统下的高可用session解决方案---Session共享

    Apache shiro集群实现 (一) shiro入门介绍 Apache shiro集群实现 (二) shiro 的INI配置 Apache shiro集群实现 (三)shiro身份认证(Shiro ...

  8. PHP session有效期session.gc_maxlifetime详解

    一个已知管用的方法是,使用session_set_save_handler,接管所有的session管理工作,一般是把session信息存储到数据库,这样可以通过SQL语句来删除所有过期的sessio ...

  9. HttpContext.Current.Session 和 Session 的区别

    Session(会话)通常指一个动作从开始到结束不间断的一个动作. 例如“打电话”,通常是“1.拿起电话--2.拨对方号码--3.对方截图--4.挂机”.这四个步骤从完成到结束组成了一个基本的Sess ...

  10. session 之session混乱解决方法(转)

    知道了session混乱产生的原因之后,也就知道了问题的根源.同时也引出了很多的问题: 1.如何记录住在线人员(这里只有帐号的系统用户,不包括访客): 2.如何限制同一个帐号在同一时间段内只能够登陆一 ...

随机推荐

  1. rocketmq 4.2.0 版本 控制台本地搭建(史上最简单教程)

    就像发现新大陆一般,瞎折腾,搞出来了..并没有网上说的一大串....(本人公司的项目从未使用过springboot....) rocketmq  控制台,官方使用springboot 做后端,前端使用 ...

  2. System.net.mail 使用ssl发送邮件失败

    我采用了.net 的自带组件System.Net.Mail发送邮件,主要是在客户注册网站成功的时候发条欢迎邮件,最近邮件无法发送了,看了下腾讯smtp邮件配置,所有的邮件发送都换成ssl了,之前用的是 ...

  3. vue.js 中双向绑定的实现---初级

    1. 1 我们看到的变量,其实都不是独立的,它们都是windows对象上的属性 <!DOCTYPE html> <html lang="en"> <h ...

  4. 尚硅谷redis学习10-复制

    是什么? 能干嘛? 怎么玩? 1) 初始情况 设置slave 日志查看 主机查看 备机日志 复制状态 觉见问题 1 切入点问题?slave1.slave2是从头开始复制还是从切入点开始复制?比如从k4 ...

  5. JS基础一-入门知识

    一.什么是JavaScript JavaScript是一种基于对象和事件驱动并具有安全性能的解释性脚本语言.JavaScript不需要编译,直接嵌入在HTTP页面中,把静态页面转变成支持用户交互并响应 ...

  6. Zabbix3.0版Graphtree的安装配置

    Graphtrees:  https://github.com/OneOaaS/graphtrees 如果是采用yum安装的zabbix-server, 则使用以下方式: # mv /usr/shar ...

  7. 在升级过内核的机器上安装docker遇到的一个错误

    出现了以下错误: [root@osd2 ~]# service docker start Starting cgconfig service: Error: cannot mount memory t ...

  8. Nginx性能优化

    一.编译安装过程优化 1.减小Nginx编译后的文件大小 在编译Nginx时,默认以debug模式进行,而在debug模式下会插入很多跟踪和ASSERT之类的信息,编译完成后,一个Nginx要有好几兆 ...

  9. kinematic与static刚体不会触发任何接触回调

    Main.as package{ import Box2D.Common.Math.b2Vec2; import Box2D.Dynamics.b2Body; import Box2D.Dynamic ...

  10. ReactiveX 学习笔记(13)基础类型

    Key Types and Life Management 本文主题是 Rx 中的基础类型 Subject 类及其生命周期的管理. 公共代码 RxNET private static void Wri ...