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
);

 

posted @ 2013-06-10 15:27  clouds008  阅读(266)  评论(0编辑  收藏  举报