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

);

 

你可能感兴趣的:(session)