11.3 Session高级应用

11.3 Session高级应用

视频讲解:光盘TMlx11Session高级应用.exe

11.3.1 Session临时文件

在服务器中,如果将所有用户的Session都保存到临时目录中,会降低服务器的安全性和效率,打开服务器存储的站点会非常慢。

【例11.4】使用PHP函数session_save_path()存储Session临时文件,可缓解因临时文件的存储导致服务器效率降低和站点打开缓慢的问题。实例代码如下:(实例位置:光盘TMsl114)

<?php $path='./tmp/'; //设置Session存储路径 session_save_path($path); session_start(); //初始化Session $_SESSION['username'] = true; ?>

注意

session_save_path()函数应在session_start()函数之前调用。

11.3.2 Session缓存

Session的缓存是将网页中的内容临时存储到IE客户端的Temporary Internet Files文件夹下,并且可以设置缓存的时间。当第一次浏览网页后,页面的部分内容在规定的时间内就被临时存储在客户端的临时文件夹中,这样在下次访问这个页面时,就可以直接读取缓存中的内容,从而提高网站的浏览效率。

Session缓存的完成使用的是session_cache_limiter()函数,其语法如下:

string session cache limiter ( [string cache_limiter])

其中,cache_limiter为public或private。同时,Session缓存并不是指在服务器端而是客户端缓存,在服务器中没有显示。

缓存时间的设置使用的是session_cache_expire()函数,其语法如下:

int session cache expire ( [int new_cache_expire])

其中,new_cache_expire是Session缓存的时间数字,单位是分钟。

注意

这两个Session缓存函数必须在session_start()调用之前使用,否则会出错。

【例11.5】了解Session缓存页面过程,实例代码如下:(实例位置:光盘TMsl115)

<?php session_cache_limiter('private'); $cache_limit=session_cache_limiter(); //开启客户端缓存 session_cache_expire(30); $cache_expire=session_cache_expire(); //设定客户端缓存时间 session_start(); ?>

运行结果如图11.10所示。

图11.10 Session客户端缓存

11.3.3 Session数据库存储

虽然通过改变Session存储文件夹使Session不至于将临时文件夹填满而造成站点瘫痪,但是可以计算一下如果一个大型网站一天登录1000人,一个月登录了30000人,这时站点中存在30000个Session文件,要在这30000个文件中查询一个session_id应该不是件轻松的事情,那么这时就可以应用Session数据库存储,也就是PHP中的session_set_save_handler()函数。

语法格式如下:

bool session set save handler ( string open, string close, string read, string write, string destroy, string gc)

session_set_save_handler()函数的参数说明如表11.2所示。

表11.2 session_set_save_handler()函数的参数说明

一般应用参数直接使用变量,但是此函数中参数为6个函数,而且在调用时只是调用函数名称的字符串。下面将分别讲解这6个参数(函数),最后把这些封装进类中,等学习完面向对象编程后就会有一个非常清晰的印象。

(1)封装_session_open()函数,连接数据库,代码如下:

function _session_open($save_path, $session_name) { global $handle; $handle=mysql_connect('localhost', 'root', 'root')or die(’数据库连接失败’); //连接MySQL数据库 mysql_select_db('db_database11', $handle)or die(’数据库中没有此库名’); //找到数据库 return(true); }

说明

这里并没有用到$save_path和$session_name,可以将它们去掉,但还是建议读者输入,因为一般使用时都是存在这两个变量的,应该养成一个好的习惯。

(2)封装_session_close()函数,关闭数据库连接,代码如下:

function _session_close() { global $handle; mysql_close($handle); return(true); }

说明

在这个函数中不需要任何参数,所以不论是Session存储到数据库还是文件中,只需返回true即可。但是如果是MySQL数据库,最好是将数据库关闭,以保证以后不会出现麻烦。

(3)封装_session_read()函数,在函数中设定当前时间的UNIX时间戳,根据$key值查找Session名称及内容,代码如下:

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_expiry是UNIX时间戳。

(4)封装_session_write()函数,函数中设定Session失效时间,查找到Session名称及内容,如果查询结果为空,则将页面中的Session根据session_id、session_name、失效时间插入数据库;如果查询结果不为空,则根据$key修改数据库中Session的存储信息,返回执行结果,代码如下:

function _session_write($key, $data) { global $handle; $time=60*60; //设置失效时间 $lapse_time=time()+$time; //得到UNIX时间戳 $handle=mysqli_connect('localhost', 'root', '111')or die(’数据库连接失败’); //连接MySQL数据库 mysqli_select_db($handle, 'db_database11')or die(’数据库中没有此库名’); //找到数据库 $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); }

(5)封装_session_destroy()函数,根据$key值将数据库中的Session删除,代码如下:

function _session_destroy($key) { global $handle; $sql="delete from tb_session where session_key='$key'"; //删除数据库sql语句 $result = mysql_query($sql, $handle); return($result); }

(6)封装_session_gc()函数,根据给出的失效时间删除过期Session,代码如下:

function _session_gc() { global $handle; $lapse_time=time(); //将参数$lapse_time赋值为当前时间戳 $sql="delete from tb_session where session_time<$lapse_time"; //删除数据库SQL语句 $result = mysql_query($sql, $handle); return($result); }

以上为session_set_save_handler()函数的6个参数(函数)。

【例11.6】下面通过函数session_set_save_handler()实现Session存储数据库。实例代码如下:(实例位置:光盘TMsl116)

session_set_save_handler('_session_open', '_session_close', '_session_read', '_session_write', '_session_destroy', '_session_gc'); session_start(); //下面为我们定义的Session $_SESSION['user'] = 'mr'; $_SESSION['pwd'] = 'mrsoft';

现在可以查看数据库中表Session的内容,如图11.11所示。

图11.11 数据库存储Session

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

微信扫一扫

微信扫一扫

微信扫一扫,分享到朋友圈

11.3 Session高级应用