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