深入解析PHP Session的高级应用与优化技巧
这篇文章主要介绍了相关资料,是关于 php session 的应用的详细介绍。有需要的朋友可以参考一下。

php session高级应用
在 web 技术中,session 极为重要。因为网页是无状态的连接程序,所以无法知晓用户的浏览状态。然而,通过 session 能够记录用户的相关信息,这样当用户再次以该身份向 web 服务器提交请求时,就可以进行确认。
用户在浏览电子商务网站时,若没有 session,那么每次浏览该网站就需要输入账户密码。
1,Session 临时文件
在服务器里,要是把用户的所有 Session 都存到临时目录当中,就会让服务器的安全性降低,同时效率也会下降。并且,打开服务器存储的站点时,速度会变得非常慢。
使用 PHP 函数 session_save_path() 来存储 Session 临时文件,这样能够缓解由于临时文件的存储而引发的服务器效率降低以及站点打开缓慢的问题。
示例代码如下:
登录后复制
注意
session_save_path() 需要在 session_start() 之前被执行。
2,Session 缓存
网页中的内容会被临时存储到 IE 客户端的 Temporary Internet Files 文件夹中,这就是 Session 缓存。同时,还可以设置缓存的时间。
Session 的缓存使用的是 session_cache_limiter()这个函数,它的语法具体如下:
调用 string_session_cache_limiter 函数并传入参数 [string cache_limiter] 。
登录后复制
其中参数 cache_limiter 要么是 public ,要么是 private 。同事 session 不在服务器端,而是在客户端。并且在服务器中没有被显示出来。
设置缓存时间时,使用的是函数 session_cache_expire(),其语法如下:
定义一个函数 int session_cache_expire,它接受一个整数类型的参数 new_cahche_expire 。
登录后复制
参数 new_cahche_expire 表示的是 session 缓存的时间,其时间是以分钟为单位的数字。
注意:
这两个 session 函数要在 session_start()函数之前予以执行。
session 缓存页面的示例代码如下:
登录后复制
运行结果如下:
3,Session数据库存储
在 php 里,Session 的数据库存储主要借助 session_set_save_handler()函数得以实现。其具体语法呈现为如下形式:
函数 session_set_save_handler 有六个参数,分别是 open 这个字符串、close 这个字符串、read 这个字符串、write 这个字符串、destroy 这个字符串以及 gc 这个字符串。它用于设置会话保存处理程序的相关操作。
下面会把这 6 个参数(函数)分别进行分装。在学习完面向对象编程之后,大家能够对其有一个更加清晰的认识。
(1) 封装session_open()函数,代码如下:
函数 _session_open 接收两个参数,分别是保存路径 $save_path 和会话名称 $session_name 。 global $handle; $handle 用于进行数据库连接操作,连接的主机是“localhost”,用户名是“root”,密码也是“root”。如果连接失败,就会输出“数据库连接失败!”。 使用指定的数据库连接句柄 $handle 选择数据库 "db_database11",如果选择失败则输出 "数据库不存在" 并终止程序。 return(true); }
登录后复制
(2)封装session_close()函数,代码如下:
function _session_close(){
global $handle;
mysql_close($handle);
return(true);
}
登录后复制
封装 session_read()函数,在该函数里设定当前时间的 UNIX 时间戳,然后依据$key去查找 Session 名片以及其内容。代码情况如下:
function _session_read($key){
全局变量$handle 用于连接数据库。
$time =time(); //设定当前时间
从 tb_session 表中选择 session_data ,条件是 session_key 等于 '$key' 并且 session_time 大于 '$time' 。
使用 handle 执行 ssql 后,得到的结果赋值给了 $result 。
从结果中获取数组形式的数据并赋值给 $row 。
if($row){
return($row['session_data']);
}else{
return(false);
}
}
登录后复制
封装 session_write()函数,该函数用于设定 Session 的失效时间,接着查找 Session 的名称及内容,若查询结果为空,就把页面中的 Session 按照 session_id、session_name 和失效时间插入到数据库中。如果查询结果存在,那么就依据 $key 来对数据库中 Session 的存储信息进行修改。具体代码如下:
函数 _session_write 用于将键值对进行写入操作,其中键为 $key ,数据为 $data 。
global $handle;
$time = 60*60;
得到 UNIX 时间戳,将当前时间加上当前时间赋值给 lapse_time 。
从 tb_session 表中选择 session_data ,条件是 session_key 等于 '$key' 并且 session_time 大于 $lapse_time ,对应的 SQL 语句为:"select session_data from tb_session where session_key = '$key' and session_time > $lapse_time" 。
mysql_query 函数执行了一个 SQL 查询语句 $sql,使用了数据库连接句柄 $handle 来执行该查询,执行的结果存储在变量 $result 中。
如果 mysql_num_rows($result) 的结果为 0,那就意味着没有结果。
将数据插入到 tb_session 表中,插入的值为键值对,键为 $key,值为 $data,还有一个时间值 $lapse_time,具体的插入语句为:insert into tb_session values('$key','$data',$lapse_time);
$result =mysql_query($sql,$handle);
}else{
更新 tb_session 表,将 session_key 设置为指定的 $key,将 session_data 设置为指定的 $data,将 session_time 设置为指定的 $lapse_time,条件是 session_key 为指定的 $key。
$result =mysql_query($sql,$handle);
}
return($result);
}
登录后复制
封装 session_destroy() 函数,依据 $key 来删除数据库中的 Sessin 。具体代码如下:
function _session_destroy(){
global $handle;
从 tb_session 表中删除满足 session_key 等于 '$key' 的记录,执行的 SQL 语句为:"delete from tb_session where session_key = '$key'";即通过该语句来实现特定条件下的数据删除操作,在这个语句中明确指定了要删除的表为 tb_session 以及删除的条件是 session_key 的值为 '$key'。
$result =mysql_query($sql,$handle);
}
登录后复制
封装 session_gc()函数,通过 Session 的失效时间来删除过期的 Session,以下是示例代码:
函数 _session_gc 接收一个参数 $expiry_time 。 global $handle; 从 tb_session 表中删除 session_expiry_time 小于当前时间的记录。具体来说,就是找到 tb_session 表中那些 session_expiry_time 字段的值比当前时间要小的行,然后将这些行从表中删除。
登录后复制