您的位置:首页 > 编程语言

Session的高级应用 (部分代码来自书上摘录)

2013-06-10 15:27 393 查看
说明:由于我解释什么的全都写在代码里了,用注释都写了好了,所以大家直接看代码吧!

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
);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: