Session技术与Cookie相似,都是用来存储使用者的相关资料。但是最大不同之处在于Cookie是将数据存放于客户端计算机中,而Session则是将数据存放于服务器系统下。

  在Web技术发展史上,虽然Cookie技术的出现是一个重大的变革,但Cookie是在客户端计算机中保存资料,所以引起了一个争议。用户有权阻止Cookie的使用,使Web服务器无法通过Cookie来跟踪用户信息。而Session技术是将使用者相关的资料存放在服务器的系统之下,所以使用者无法停止Session的使用。

  可以把Cookie比喻成第一次去商场时为你提供的会员卡,并有用户自己保存。如果用户下次再去商场购物时忘记带卡了,或者是把卡弄丢了,这样用户就不能再以会员的身份购物了。但是如果商场在为用户办理会员卡以后,再由商场保存这张卡,用户就不用每天都把卡放在身上了。但是商场的会员特别多,你每次来时,商场怎么知道你是这里的会员呢?所以在用户办理会员卡时,商场会要求用户保存会员卡的卡号。下次这个用户再来购物时,商场就可以通过用户提供的卡号查询到会员的登记信息。

  Session就是这样,在客户端仅需要保存由服务器为用户创建的一个Session标识符(相当于会员卡卡号),称为Session ID,而在服务器端(文件/数据库/Memcache中)保存Session变量的值。Session ID是一个既不会重复,又不容易找到规律的,由32位十六进制数组成的字符串。Session ID会被保存在客户端的Cookie里,如果用户阻止Cookie的使用,则可以将Session ID保存在用户浏览器地址栏的URL中。当用户请求Web服务器时,就会把Session ID发送给服务器,再通过Session ID提取保存在服务器中的Session变量。可以把Session中保存的变量,当做是这个用户的全局变量,同一个用户对每个脚本的访问都共享这些变量。

  当某个用户想Web服务器发送请求时,服务器首先检查这个客户端的请求是否已经包含了一个Session ID。如果包含,说明之前已经为此用户创建国Session ID,服务器则按该Session ID把Session检索出来使用。如果客户端请求不包含Session ID,则为该用户创建一个Session,并且生成一个与此Session关联的Session ID,在本次相应中被传送给客户端保存。

配置SESSION

  在PHP配置文件中,有一组和Session相关的配置选项。通过对一些选项重新设置新值,就可以对Session进行配置,否则使用默认的Session配置。在php.ini文件中和Session有关的,一些有意义选项及其描述如下表所示。

选项名 描述 默认值
session.auto_start 在客户访问任何页面时自动开启并初始化Session,默认禁止(因为类定义必须在会话之前被载入,所以若打开这个选项,你就不能在会话中存放对象) 禁用(0)
session.cookie_domain 传递会话ID的Cookie作用域(默认为空时会根据Cookie规范去自动生成主机名) none
session.cookie_lifetime Cookie中Session ID在客户机上保存的有效期(秒),0表示延续到浏览器关闭时 0
session.cookie_path 传递会话ID的Cookie作用路径 /
session.name 会话的名称,用在客户端Cookie里会话ID标识名,只能包含字母和数字 PHPSESSID
session.save_path 对于files处理器,此值是创建会话数据文件的路径 /tmp
session.use_cookies 是否使用Cookie在客户端保存会话ID,1表示允许 1
session.use_trans_sid 是否使用明码在URL中显示SID(会话ID)。(基于URL的会话管理总是比基于Cookie的会话管理有更多的风险,所以应当禁用) 默认禁止(false)
session.gc_probability

定义在每次初始化会话时,启动垃圾回收程序的概率,这个概率计算公式如下:

session.gc_probability/session.gc_divisor

对会话页面访问频繁,概率就越小。建议值为1/1000~5000

1/1000
session.gc_divisor
session.gc_maxlifetime 超过此参数所指的秒数后,保存的数据将被视为‘垃圾’并由垃圾回收程序清理 1440(24分钟)
session.save_handler 存储和检索与会话关联的数据的处理器名字,可以使用(files、user、sqlite、memcache)中的一个值,默认为文件(files),如果想要使用自定义的处理器(如基于数据库或者Memcache的处理器),可用“user” files

Session的声明与使用

  Session的设置不同于Cookie,必须先启动,在PHP中必须调用session_start()函数,以便让PHP核心程序,将和Session相关的内建环境变量预先载入至内存中。

  bool session_start(void)

  这个函数没有参数,且返回值均为TRUE。有两个主要作用,一是开始一个会话,二是返回已经存在的会话。

  当第一次访问网站时,session_start()函数就会创建一个唯一的Session ID,并自动通过HTTP的响应头,将这个Session ID保存在客户端Cookie中。同时,也在服务器端创建一个以这个Session ID命名的文件,用于保存这个用户的会话信息。当同一个用户再次访问这个网站时,也会自动通过HTTP的请求头将客户端Cookie中保存的Session ID再携带过来,这时session_start()函数就不会再去分配一个新的Session ID,而是在服务器的硬盘上去寻找和这个Session ID同名的Session文件,将之前为这个用户保存的会话信息读出,在当前脚本应用达到跟踪这个用户的目的。所以在会话期间,同一个用户在访问服务器上的任何页面时,都是同一个Session ID。

  如果你是使用基于Cookie的Session,在使用该函数开启Session之前,不能有任何输出的内容。因为基于Cookie的Session是在开启的时候,调用session_start()函数会生成一个唯一的Session ID,需要保存在客户端计算机的Cookie中,和setcookie()函数一样,有头信息的设置过程,所以在调用之前不能有任何的输出,空格或空行也不行。

  如果不想在每个脚本都使用session_start()函数开启Session,可以在php.ini里设置“session.auto_start=1”,则无须每次使用Session之前调用session_start()函数。但启用该选项也有一些限制,即不能将对象放入Session中,因为类定义必须在启动Session之前加载。所以不建立使用php.ini的session.auto_start属性来开启Session。

注册一个会话变量和读取Session

  在PHP中使用Session变量,除了必须要启动之外,还要经过注册的过程。注册和读取Session变量,都要通过访问 $_SESSION数组完成。但必须在调用session_start()函数开启Session之后才能使用。$_SESSION总是具有全局范围,因此不需要对$_SESSION使用global关键字。

session_start();
$_SESSION['username'] = "skygao";
$_SESSION['uid'] = 1;

  执行该脚本后,两个Session变量就会被保存在服务器端的某个文件中,该文件的位置是通过php.ini文件,在session.save_path属性执行的目录下,为这个访问的用户单独创建的文件,用来保存注册的Session值。例如,某个保存Session变量的文件名为“sess_1uebcnr0cd3ocbjg36s8ep0105”,文件名中含Session ID,所以每个访问用户在服务器都有自己的保存Session变量的文件。该文件的内容结构如下所示:

  变量名|类型:长度:值;

  本例在Session中注册了两个变量,如果在服务器找中找到为该用户保存Session变量的文件,打开后可以看到如下内容:

username|s:6:"skygao";uid|i:1;

注销变量与销毁Session

  当使用完一个Session变量后,可以将其删除,当完成一个会话后,也可以将其销毁。销毁和当前Session有关的所有资料,可以调用session_destroy()函数结束当前的会话,并清空会话中所有资源。

  bool session_destroy(void)

  相对于session_start()函数(创建Session文件),该函数用来关闭Session的运作(删除Session文件),如果成功则传回TRUE,销毁Session资料失败则返回false。但该函数并不会释放和当前Session相关的变量,也不会删除保存在客户端Cookie中的Session ID。因为$_SESSION数组和自定义的数组在使用上是相同的,所以我们可以使用unset()函数来释放Session中注册的单个变量。

unset($_SESSION['username']);
unset($_SESSION['uid']);

  一定要注意,不要使用unset($_SESSION)删除整个$_SESSION数组,这样将不能再通过$_SESSION超全局数组注册变量。但如果想把某个用户在Session中注册的所有变量都删除,可以直接将数组变量$_SESSION赋上一个空数组。

$_SESSION = array();

  PHP默认的Session是基于Cookie的,Session ID被服务器存储在客户端的Cookie中,所以销毁Session时也要清除Cookie中保存的Session ID,而这就必须借助setcookie()函数完成。在Cookie中,保存Session ID的Cookie标示名称就是Session的名称,这个名称是php.ini中,通过session.name属性指定的值。在PHP脚本中,可以通过调用session_name()函数获取Session名称。删除保存在客户端Cookie中的Session ID,代码如下:

if(isset($_COOKIE[session_name()])){
setcookie(session_name(),'',time() - 3600,'/');
}

  通过前面的介绍可以总结出,Session的注销过程共需要4个步骤,在下例中,提供完整的4个步骤代码,运行该脚本就可以关闭Session,并销毁与本次会话相关的所有资源,代码如下所示:

session_start();
//第一步:开启Session并初始化 $_SESSION = array();
//第二步:删除所有Session变量,也可以用unset($_SESSION[xxx])逐个删除 if(isset($_COOKIE[session_name()])){
setcookie(session_name(),'',time() - 3600 ,'/');
}
//第三步:如果使用基于Cookie的Session,使用setcookie()删除包含SESSION ID的Cookie session_destroy();
//第四步:最后彻底销毁Session

  使用“$_SESSION = array();”清空$_SESSION数组的同时,也将这个用户在服务器端对应的Session文件内容清空,而使用session_destroy()时,则是将这个用户在服务器端对应的Session文件删除。

会话控制Session的应用的更多相关文章

  1. 会话控制:SESSION,COOKIE

    1.http协议: HTTP—超文本传输协议,在TCP协议(长连接.像一个硬件)基础上; 特点:短连接,无状态协议,没法记录本次连接的状态;适用于静态页面的访问,对于后期某些页面是需要浏览器预知客户信 ...

  2. PHP会话控制Session与Cookie

    理解会话控制的概念: 阅读过HTTP协议相关资料的同学都会知道HTTP协议是WEB服务器与客户端(浏览器)相互通信的协议,它是一种无状态协议,所谓无状态,指的是不会维护http请求数据,http请求是 ...

  3. PHP......会话控制SESSION与COOKIE

    一.SESSION Session:在计算机中,尤其是在网络应用中,称为“会话控制”.Session 对象存储特定用户会话所需的属性及配置信息.这样,当用户在应用程序的 Web 页之间跳转时,存储在 ...

  4. 会话控制session,cookie(0521)

    简单介绍: 一.什么是session? 1. 定义: Session,在计算机中,尤其是在网络应用中,称为“会话”.在计算机专业术语中,Session是指一个终端用户与交互系统进行通信的时间间隔,通常 ...

  5. 跟着百度学PHP[15]-会话控制session的工作机制

    COOKIE和SESSION的两大区别: cookie是存储与客户端 session是存储与服务端 需要开启session的时候需要使用session_start开启,且session的开头不能拥有任 ...

  6. PHP中的会话控制—session和cookie(实现数据传值功能)

    1.session  登录上一个页面以后,长时间没有操作,刷新页面以后需要重新登录. 特点:(1)session是存储在服务器:   (2)session每个人(登陆者)存一份: (3)session ...

  7. 代码练习之 登陆 PHP会话控制 session cookie

    log.html <html> <head><title>Home Page</title></head> <body> < ...

  8. 会话控制:session与cookie

    我们在浏览网站时,访问的每一个web页面都需要使用"http协议"实现.而HTTP协议是无状态协议,就是说HTTP协议没有一个内建机制来维护两个事务之间的状态.当一个用户请求一个页 ...

  9. php 会话控制(Session会话控制)

    php的session会话是通过唯一的会话ID来驱动的,会话ID是一个加密的随机数字,由php生成,在会话的生命周期中都会保存在客户端.客户端保存数据的地方只有cookie,所以php的会话ID一般保 ...

随机推荐

  1. 【转】CStdioFile UNICODE编译 英文系统下读取中文汉字乱码解决

    转载出处:http://www.cnblogs.com/ct0421/p/3242418.html 函数原形为:char *setlocale( int category, const char *l ...

  2. 如何让WPF程序用上MVVM模式

    https://msdn.microsoft.com/zh-cn/magazine/dd419663.aspx

  3. select标签设置只读的方法(下拉框不可选但可传值)

    1. <select id="s1" name="s1" onfocus="this.defaultIndex=this.selectedInd ...

  4. uiautomatorviewer.bat使用方法

    在android目录下找到uiautomatorviewer.bat,然后双击,页面的第二个按钮连接设备 D:\Program Files\android-sdk-windows\tools\uiau ...

  5. 在TextView中设置DrawableLeft不显示的问题

    1.在XML中使用 android:drawableLeft="@drawable/icon" 2.代码中动态变化 Drawable drawable= getResources( ...

  6. shell学习之路(整理ing)

    学习 shell脚本之前的基础知识 http://www.92csz.com/study/linux/12.htm SHELL 脚本 http://www.92csz.com/study/linux/ ...

  7. codeforces2015ICL,Finals,Div.1#J Ceizenpok’s formula【扩展lucas】

    传送门 [题意]: 求C(n,k)%m,n<=108,k<=n,m<=106 [思路]: 扩展lucas定理+中国剩余定理    #include<cstdio> usi ...

  8. 【BZOJ4896】[Thu Summer Camp2016]补退选 Trie树

    [BZOJ4896][Thu Summer Camp2016]补退选 Description X是T大的一名老师,每年他都要教授许多学生基础的C++知识.在T大,每个学生在每学期的开学前都需要选课,每 ...

  9. 【BZOJ1067】[SCOI2007]降雨量 RMQ+特判

    [BZOJ1067][SCOI2007]降雨量 Description 我们常常会说这样的话:“X年是自Y年以来降雨量最多的”.它的含义是X年的降雨量不超过Y年,且对于任意Y<Z<X,Z年 ...

  10. [LintCode] 带重复元素的排列

    递归实现: class Solution { public: /** * @param nums: A list of integers. * @return: A list of unique pe ...