• Session的高级应用 (部分代码来自书上摘录)


    说明:由于我解释什么的全都写在代码里了,用注释都写了好了,所以大家直接看代码吧!

    1、Session临时文件 --自定义存放session文件位置(磁盘)

    <?php
        /*在服务器中,如果将所有用户的Session保存在临时目录中,将降低服务器的安全性和效率,打开服务器会非常慢*/
        $path = 'tmp/'; //设置session的存储路劲
        /*session_save_path(); 函数应该在session_start函数启动之前调用,否则会出现错误*/
        session_save_path($path); //使用session_save_path() 函数设置session的存储临时文件夹
        session_start();  //启动session
        $_SESSION['username'] = true;
    ?>

    2、Session缓存 --如果缓存没有被删除的话,下次访问直接就访问缓存中的文件了。缓存存在于客户端

      适用于那种更新较少的网站使用

    <?php
        /*session缓存  --下面两个函数必须在session_start() 函数启动之前设定和调用,否则会出错*/
        /*session_cache_limiter() 函数是指缓存存在于客户端而不是服务端*/
        session_cache_limiter('private'); //设置客户端缓存权限为私有的 --有public和private
        $cache_limit = session_cache_limiter();  //开启客户端缓存
        session_cache_expire(2);  //时间单位是: 分钟
        $cache_expire = session_cache_expire();  //设定客户端缓存时间
        session_start();  //启动session
        echo "缓存权限为: $cache_limit <br /> 缓存session失效时间在 $cache_expire 分钟后失效!";
    ?>

    3、Session数据库储存 --把Session文件存放在数据库中,每次读取从数据库中读取

      我们也可以直接把Session的ID 存放在服务器中,Session文件仍然存放在我们指定的地方。下次只要读取session_id就行了。其实现在一般网站都这么做。都把id放数据库。文件放服务器(这样做比较折中,也可以防止用户禁止了cookie,因为一般sessionid默认放cookie里面的,而cookie是存放在客户端的.)

    <?php
        /*
         虽然通过改变Session存储文件夹使session不至于将临时文件夹填满而造成站点瘫痪,但是可以计算一下如果一个大型
         网站一天登陆1000人,一个月登陆了30000人,这时站点中存在30000个Session文件,要在这30000个文件中查询一个
         session_id应该不是一件轻松的事情,那么这时就可以应用Session数据库存储,也就是PHP中的
         session_set_save_handler(string open,string close,string read,string write,string destroy,string gc)函数。 
         一般应用参数直接使用变量,但是此函数中参数为6个函数,而且在调用时只是调用函数名称的字符串。
         参数说明:
            -----------------------------------------------------------------------
                  参数                       ¦            说明    
            -----------------------------------------------------------------------
             open(save_path,session_name)   ¦     找到Session存储地址,取出变量名称
            -----------------------------------------------------------------------
             close()                        ¦     不需要参数,关闭数据库
            -----------------------------------------------------------------------
             read(key)                      ¦     读取Session键值,Key对应Session_id
            -----------------------------------------------------------------------
             write(key,data)                ¦     其中data对应设置的 Session 变量
            -----------------------------------------------------------------------
             destroy(key)                   ¦     注销Session对应 Session 键值
            -----------------------------------------------------------------------
             gc(expiry_time)                ¦      清除过期 Session 记录
            -----------------------------------------------------------------------
            
         下面我们把session_set_save_handler()函数中六个参数分别封装成六个方法  --大家尽可能的用类封装好
        */
        
        /*封装session_open()函数,连接数据库*/
        function _session_open($save_path,$session_name) //这里两个参数没有用到,但也写上
        {
            global $handle; //声明为全局可以引用的
            $handle = mysql_connect('localhost','root','mysql') or die('数据库连接失败'); //连接Mysql数据库
            //第二个可选参数,是如果当前没有连接,则指定上一个连接(就是自己手动指定一个连接)
            mysql_select_db('db_session',$handle) or die('数据库中没有此数据库名!');  //找到数据库
            return(true);  //这里return是一种结构不是一种函数,所以可以不用括号,用哪种都一样如: return true;
        }
        
        /*封装session_close()函数,关闭数据库连接*/
        function _session_close()
        {
            global $handle; //引用全局
            @mysql_close($handle);
            return(true);
        }
        
        /*封装session_read()函数,设定的时间为linux时间戳*/
        function _session_read($key)
        {
            global $handle;    //全局变量$handle连接数据库
            $time = time();    //设定当前时间
            $sql = "select session_data from tb_session where session_key='$key' and session_time > $time";
            $result = mysql_query($sql,$handle); //执行语句,并指定连接
            $row = mysql_fetch_array($result); //读取返回的结果集
            if($row)
            {
                return $row['session_data'];  //返回Session名称及内容
            }
            else
            {
                return false;  //没读到返回假
            }
        }
        
        /*封装session_write()函数*/
        function _session_write($key,$data)
        {
            global $handle;
            $time = 60*60;     //设置失效时间
            $lapse_time = time()+$time;   //得到Uinx时间戳
            $sql = "select session_data from tb_session where session_key='$key' and session_time > $lapse_time";
            $result = mysql_query($sql,$handle);
            if(mysql_num_rows($result) == 0)    //没有结果
            {
                $sql = "insert into tb_session values('$key','$data',$lapse_time)";  //插入数据库sql语句
                $result = mysql_query($sql,$handle);
            }
            else
            {
                $sql = "update tb_session set session_key='$key',session_data='$data',session_time=$lapse_time where session_key='$key'";  //修改数据库sql语句
                $result = mysql_query($sql,$handle);
            }
            return $result;  //返回执行的结果集
        }
        
        /*封装session_destroy()函数*/
        function _session_destroy($key)
        {
            global $handle;
            $sql = "delete from tb_session where session_key='$key'";  //根据$key删除数据库语句
            $result = mysql_query($sql,$handle);
            return $result;
        }
        
        /*封装 sesson_gc函数,根据给出的失效时间删除过期的Session*/
        function _session_gc($expiry_time)
        {
            global $handle;
            $lapse_time = time();
            //书上这里把sql语句中的session_time写成了expiry_time,这是错误的,因为数据表就三个字段。这里我自己改了过来
            $sql = "delete from tb_session where session_time<$lapse_time"; //删除数据库sql语句
            $result = mysql_query($sql,$handle);
            return $result;
        }
    ?>
    <?php
        //此函数只需要调用上面封装的六个函数中的函数名称字符串就行了  --必须放在启动session之前
        session_set_save_handler('_session_open','_session_close','_session_read','_session_write','_session_destroy','_session_gc');
        session_start(); //启动session
        //下面为我们定义的 Session
        $_SESSION['user'] = 'mr';
        $_SESSION['pwd'] = 'mrsoft';
    ?>

     下面是所需的数据库,sql文件

    drop database if exists db_session;
    
    create database db_session;
    
    use db_session;
    
    drop table if exists tb_session;
    
    create table tb_session
    (
       session_key longtext not null,
       session_data longtext not null,
       session_time int not null
    );
  • 相关阅读:
    百度JS模板引擎 baiduTemplate 1.0.6 版
    javascript 拖放效果
    二维码的生成(可设置大小)以及插件下载地址
    处理html页面元素工具类(HtmlAgilityPack.dll)的使用
    webstrom一键上传github及使用
    git bash上传代码到github
    CSS 样式书写规范+特殊符号
    Html的基本元素(Element)
    AttributeError: 'Sxgl' object has no attribute 'driver' 解决方法之一
    Linux 监控数据库资源占用
  • 原文地址:https://www.cnblogs.com/clouds008/p/3130771.html
Copyright © 2020-2023  润新知