zoukankan      html  css  js  c++  java
  • 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
    );
  • 相关阅读:
    消息中间件(一)MQ详解及四大MQ比较
    SIP协议
    PAT (Basic Level) Practice 1008 数组元素循环右移问题
    LeetCode-Algorithms 1. 两数之和
    PAT (Basic Level) Practice 1040 有几个PAT
    PAT (Basic Level) Practice 1023 组个最小数
    PAT (Basic Level) Practice 1021 个位数统计
    PAT (Basic Level) Practice 1007 素数对猜想
    PAT (Basic Level) Practice 1006 换个格式输出整数
    PAT (Basic Level) Practice 1004 成绩排名
  • 原文地址:https://www.cnblogs.com/clouds008/p/3130771.html
Copyright © 2011-2022 走看看