首页 > PHP教程 > php开发知识文章

php session机制详解

本文主要介绍了php session机制详解,欢迎大家的学习。

session机制

PHP session 变量用于存储有关用户会话的信息,或更改用户会话的设置。Session 变量保存的信息是单一用户的,并且能供应用程序中的所有页面使用。

Session 的工作机制是:为每个访问者创建一个唯一的 id (UID),并基于这个 UID 来存储变量。UID 存储在 cookie 中,或通过 URL 进行传递。

php session高级应用

session机制在web技术中非常重要,由于http协议是一种无状态的应用协议,因此无法得知用户的浏览状态。

通过session则能记录用户的有关信息,以供用户再次以此身份访问网站时,web服务器直接通过sessoin来识别用户。

如:用户在浏览电子商务网站时,如果没有session,那么用户每次浏览就需要输入账户密码。

1. Session 临时文件

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

使用PHP函数session_save_path()函数存储Session临时文件,来缓解因临时文件的存储导致的服务器效率降低或站点打开缓慢的问题。

代码如下:

$path = "./tmp/";    //设置session存储的路径
session_save_path($path);
session_start();
$_SESSION['user'] = true;

注意:session_save_path() 必须在session_start() 之前执行。

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

参数new_cahche_expire 是session缓存的时间数字,单位分钟。

注意: 这两个session函数必须在session_start()函数之前执行

session 缓存页面的代码如下:

session_cache_limiter("private");
$cache_limit = session_cache_limiter();
//开启客户端缓存
echo "缓存限制为:" . $cache_limit . "/n";
session_cache_expire(30);
$cache_expire = session_cache_expire(); //设定客户端缓存时间
echo "客户端缓存时间为:" . $cache_expire . "分钟/n";
session_start();

3. Session数据库存储

在php中Session 的数据库存储是通过 session_set_save_handler()函数来实现的。 语法如下:

bool session_set_save_handler(string open,string close,string read,string write,string destroy,string gc);

php session机制详解

(1) 封装session_open()函数,代码如下:

function _session_open($save_path, $session_name)
{
global $handle;
$handle = mysql_connect('localhost', 'root', 'root') or die('数据库连接失败!');
mysql_select_db('db_session', $handle) or die('数据库不存在');
return (true);
}

(2)封装session_close()函数,代码如下:

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

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

function _session_read($key)
{
golbal $handle;
//全局变量$handle 连接数据库
$time = time(); //设定当前时间
$sql = "select session_data from tb_session where session_key = '$key' and session_time>'$time'";
$result = mysql_query($ssql, $handle);
$row = mysql_fetch_array($result);
if ($row) {
return ($row['session_data']);
} else {
return (false);
}
}

(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时间戳
$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)";
$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'";
$result = mysql_query($sql, $handle);
}
return ($result);
}

(5) 封装session_destroy(),根据$key删除数据库中的Sessin.代码如下:

function _session_destroy()
{
global $handle;
$sql = "delete from tb_session where session_key ='$key'";
$result = mysql_query($sql, $handle);
}

(6)封装session_gc(),根据Session的失效时间删除过期的Session,示例代码如下:

function _session_gc($expiry_time)
{
global $handle;
$sql = "delete from tb_session where session_expiry_time<$expiry_time";
$result = mysql_query($sql, $handle);
return ($result);
}

以上就是本文php session机制详解的全部内容。

关闭
感谢您的支持,我会继续努力!
扫码打赏,建议金额1-10元


提醒:打赏金额将直接进入对方账号,无法退款,请您谨慎操作。