PHP Session机制简介及用法


Posted in PHP onAugust 19, 2014

当服务器创建了一个session(session_start()),服务器将会在服务器的指定文件夹下创建一个session文件,其名称为sessionID,并当做cookie的值发送给浏览器。浏览器每次访问该服务器时便会带着这个cookie,服务器便会识别改sessionID,找到相应的session文件。该文件中存放了若干键值对。该session文件所存放的文件夹可以在配置文件php,ini中修改。

PHP Session机制简介及用法

cookie 每次请求页面的时候进行验证,如果用户信息存储在数据库中,每次都要执行一次数据库查询,给数据库造成多余的负担。cookie可以被修改的,所以安全系数太低。

session是存储在服务器端面的会话,相对安全,并且不像Cookie那样有存储长度限制。由于Session是以文本文件形式存储在服务器端的,所以不怕客户端修改Session内容。实际上在服务器端的Session文件,PHP自动修改session文件的权限,只保留了系统读和写权限,而且不能通过ftp修改,所以安全得多。

对于 Cookie 来说,假设我们要验证用户是否登陆,就必须在 Cookie 中保存用户名和密码(可能是 md5 加密后字符串),并在每次请求页面的时候进行验证。

如果用户名和密码存储在数据库,每次都要执行一次数据库查询,给数据库造成多余的负担。因为我们并不能 只做一次验证。为什么呢?

因为客户端 Cookie 中的信息是有可能被修改的。假如你存储 $admin 变量来表示用户是否登陆,$admin 为 true 的时候表示登陆,为 false 的时候表示未登录,在第一次通过验证后将 $admin 等于 true 存储在 Cookie,下次就不用验证了,这样对么?错了,假如有人伪造一个值为 true 的 $admin 变量那不是就立即取的了管理权限么?非常的不安全。

而 Session 就不同了,Session 是存储在服务器端的,远程用户没办法修改 Session 文件的内容,因此我们可以单纯存储一个 $admin 变量来判断是否登陆,首次验证通过后设置 $admin 值为 true,以后判断该值是否为 true,假如不是,转入登陆界面,这样就可以减少很多数据库操作了。

而且可以减少每次为了验证 Cookie 而传递密码的不安全性了(Session 验证只需要传递一次,假如你没有使用 SSL 安全协议的话)。即使密码进行了 md5 加密,也是很容易被截获的。

session 会话会为每一个开启了 session 会话的访问者建立一个唯一的会话 ID ,用于识别用户。该会话 ID 可能存储于用户电脑的 cookie 内,也可能通过 URL 来传递。而对应的具体 session 值会存储于服务器端,这也是与 cookie 的主要区别,并且安全性相对较高。

创建 session

要创建 session 或返回已经存在的会话 ,就必须先使用 session_start() 函数开启一个 session 会话,系统会分配一个会话 ID:

<?php
session_start();//此函数没有参数,且返回值均为true。最好将这个函数置于最先,而且在它之前不能有任何输出,否则会报警
?>

注册session变量

使用 session_register() 函数注册一个 session 变量,成功返回 TRUE ,否则返回 FALSE 。

语法:bool session_register( mixed name [, mixed ...] )

使用 session_register() 函数可以在目前会话下注册一个或多个全局 session 变量。 参数name就是想要加入的变量名,成功则返回逻辑值true。可以用$_SESSION[name]或$HTTP_SESSION_VARS[name]的形式来取值或赋值。

例子:

<?php
session_start();
$username = "nostop";
session_register("username");
?>

在该例子中,我们向 session 注册了一个名为 username 的变量,其值为 nostop 。

读取 session

PHP 内置的 $_SESSION 变量可以很方便的访问设置的 session 变量。

例子:

<?php
session_start();
echo "登记的用户名为:".$_SESSION["username"];  //输出 登记的用户名为:nostop
?>

销毁 session

session_unregister()  注销单个 session 变量
unset($_SESSION['age']); 用于注销以$_SESSION['age']注册的session变量
session_unset()  删除所有已注册的变量
session_destroy() 注销所有的session变量,并注销整个 session 会话

例子:

<?php
session_start();
session_unregister("username");  //注销 session 某个变量
session_unset();     //注销 session 会话
?>

检查变量是否被登记为会话变量

session_is_registered

语法:boobean session_is_registered(string name);

这个函数可检查当前的session之中是否已有指定的变量注册,参数name就是要检查的变量名。成功则返回逻辑值true。

例子:

<?php
  session_start();
  if(!session_is_registered("gender")){ //判断当前会话变量是否注册
    session_register("gender");  //注册变量
  }
  $gender="女";
  echo $_SESSION['gender']; //女
?>

存取当前会话名称

session_name

语法:boolean session_name(string [name]);

这个函数可取得或重新设置当前session的名称。若无参数name则表示获取当前session名称,加上参数则表示将session名称设为参数name。

例子:

<?php

$sessionName = session_name();  //取得当前 Session 名,默认为 PHPSESSID
$sessionID = $_GET[$sessionName];  //取得 Session ID
session_id($sessionID);   //使用 session_id() 设置获得的 Session ID
?>

存取当前会话标识号

session_id

语法:boolean session_id(string [id]);

这个函数可取得或重新设置当前存放session的标识号。若无参数id则表示只获取当前session的标识号,加上参数则表示将session的标识号设成新指定的id。

设置 Session 的生存期

setcookie:向客户端发送一个 HTTP cookie。

<?php
  session_start
  // 保存一天
  $lifeTime = 24 * 3600;
  setcookie(session_name(), session_id(), time() + $lifeTime, "/");
?>

session_set_cookie_params:设置 Session 的生存期的,该函数必须在 session_start() 函数调用之前调用。
如果客户端使用 IE 6.0 , session_set_cookie_params(); 函数设置 Cookie 会有些问题,所以我们还是手动调用 setcookie 函数来创建 cookie。

// 保存一天

<?php
$lifeTime = 24 * 3600;
session_set_cookie_params($lifeTime);
session_start();
$_session["admin"] = true;
?>

设置 Session 文件的保存路径

session_save_path() :必须在 session_start() 函数调用之前调用。

<?php
// 设置一个存放目录
$savePath = "./session_save_dir/";
// 保存一天
$lifeTime = 24 * 3600;
session_save_path($savePath);
session_set_cookie_params($lifeTime);
session_start();
$_session["admin"] = true;
?>
<?php
session_start();  //启动Session
$username='nostop';
session_register('username');  //注册一个名为username变量
echo '登记的用户:'.$_SESSION['username'];  //登记的用户:nostop  读取Session变量

$_SESSION['age']=23;  //声明一个名为age的变量,并赋值
echo '年龄:'.$_SESSION['age']; //年龄:23

session_unregister('username'); //注销Session变量
echo $_SESSION['username']; //空
echo $_SESSION['age'];//23

unset($_SESSION['age']); //注销Session变量
echo '登记的用户:'.$_SESSION['username']; //空
echo '年龄:'.$_SESSION['age']; //空
?>
PHP 相关文章推荐
基于qmail的完整WEBMAIL解决方案安装详解
Oct 09 PHP
PHP实现定时生成HTML网站首页实例代码
Nov 20 PHP
php array_pop()数组函数将数组最后一个单元弹出(出栈)
Jul 12 PHP
php分页代码学习示例分享
Feb 20 PHP
使用CodeIgniter的类库做图片上传
Jun 12 PHP
php限制ip地址范围的方法
Mar 31 PHP
php计算给定时间之前的函数用法实例
Apr 03 PHP
PHP实现链式操作的核心思想
Jun 23 PHP
php实现自定义中奖项数和概率的抽奖函数示例
May 26 PHP
利用php的ob缓存机制实现页面静态化方法
Jul 09 PHP
PHP实现的防止跨站和xss攻击代码【来自阿里云】
Jan 29 PHP
php 防护xss,PHP的防御XSS注入的终极解决方案
Apr 01 PHP
phpExcel中文帮助手册之常用功能指南
Aug 18 #PHP
PHP 导出Excel示例分享
Aug 18 #PHP
PHPer 需要了解的 5 个 Composer 小技巧
Aug 18 #PHP
PHP管理依赖(dependency)关系工具 Composer的自动加载(autoload)
Aug 18 #PHP
PHP实现取得HTTP请求的原文
Aug 18 #PHP
PHP管理依赖(dependency)关系工具 Composer 安装与使用
Aug 18 #PHP
PHP中使用asort进行中文排序失效的问题处理
Aug 18 #PHP
You might like
ThinkPHP CURD方法之page方法详解
2014/06/18 PHP
thinkphp判断访客为手机端或PC端的方法
2014/11/24 PHP
php简单实现发送带附件的邮件
2015/06/10 PHP
Javascript下判断是否为闰年的Datetime包
2010/10/26 Javascript
自写的jQuery异步加载数据添加事件
2014/05/15 Javascript
jQuery使用load()方法载入另外一个网页文件内的指定标签内容到div标签的方法
2015/03/25 Javascript
基于jQuery实现动态数字展示效果
2015/08/12 Javascript
谈谈JSON对象和字符串之间的相互转换JSON.stringify(obj)和JSON.parse(string)
2015/10/01 Javascript
BootStrap中的table实现数据填充与分页应用小结
2016/05/26 Javascript
ES6新特性之字符串的扩展实例分析
2017/04/01 Javascript
NodeJs模拟登陆正方教务
2017/04/28 NodeJs
使用javaScript实现鼠标拖拽事件
2020/04/03 Javascript
vue select二级联动第二级默认选中第一个option值的实例
2018/01/10 Javascript
JS删除数组里的某个元素方法
2018/02/03 Javascript
vue-router的HTML5 History 模式设置
2018/09/08 Javascript
vuex根据不同的用户权限展示不同的路由列表功能
2019/09/20 Javascript
关于layui导航栏不展示下拉列表的解决方法
2019/09/25 Javascript
Vue-cli3生成的Vue项目加载Mxgraph方法示例
2020/05/31 Javascript
[02:08]DOTA2英雄基础教程 马格纳斯
2014/01/17 DOTA
[02:04]2014DOTA2国际邀请赛 BBC小组赛第三天总结
2014/07/12 DOTA
[02:11]2016国际邀请赛中国区预选赛全程回顾
2016/07/01 DOTA
Python脚本实现下载合并SAE日志
2015/02/10 Python
用Python写王者荣耀刷金币脚本
2017/12/21 Python
Python实现平行坐标图的绘制(plotly)方式
2019/11/22 Python
python3中sorted函数里cmp参数改变详解
2020/03/12 Python
Python3标准库glob文件名模式匹配的问题
2020/03/13 Python
pycharm工具连接mysql数据库失败问题
2020/04/01 Python
用python爬虫批量下载pdf的实现
2020/12/01 Python
百丽国际旗下购物网站:优购
2017/02/28 全球购物
澳大利亚UGG工厂直销:Australian Ugg Boots
2017/10/14 全球购物
Charles & Keith欧盟:新加坡时尚品牌
2019/08/01 全球购物
演讲比赛获奖感言
2014/02/02 职场文书
幼儿园教师获奖感言
2014/03/11 职场文书
村级换届选举方案
2014/05/10 职场文书
欠条样本
2015/07/03 职场文书
Redis RDB技术底层原理详解
2021/09/04 Redis