一 序言
Session与Cookie是PHP开发中不可或缺的一个重点 , 主要用于跟踪用户的登录信息,实现跨页面传值等功能, 那么Session与Cookie到底是什么呢?本篇文章将对此进行详细讲解
二 理解会话控制
简单地说会话控制就是跟踪和识别用户信息的机制。会话控制的思想就是能够在网站中跟踪一个变量,通过这个变量,系统能识别出相应的用户信息,根据这个用户信息可以得知用户权限,从而展示给用户适合于其相应权限的页面内容。目前最主要的会话跟踪方式就是Session与Cookie
三 HTTP特性
要理解会话控制这个概念 , 就需要提到它所处的Web环境与它使用的HTTP协议
无状态
无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量量增大。另一方面,在服务器不需要先前信息时它的应答就较快
无状态性客户端与服务器端连接通信运行速度快,服务器应答也快。因为无状态,协议对事务处理是没有记忆性的,是独立的。所以为了满足后面事务需要前面的事务有关信息,所以事务有关的信息要在协议外发送。
四 Cookie
什么是Cookie
最早是网景公司的前雇员Lou Montulli在1993年3月的发明。Cookie是当你浏览某网站时,服务器存储在你机器上的一个小文本文件,再次来到该网站时,网站通过读取Cookie,得知你的相关信息,就可以做出相应的动作。
Cookie是如何传递的
Cookie是利用了网页代码中的HTTP头信息进行传递的,浏览器的每一次网页请求,都可以伴随Cookie传递。
服务器将Cookie添加到网页的HTTP头信息中,伴随网页数据传回到你的浏览器,浏览器会根据你电脑中的Cookie设置选择是否保存这些数据。
如果浏览器不允许Cookie保存,那么关掉浏览器后,这些数据就消失。
Cookie的生命周期
Cookie有一个Expires/Max-Age(有效期)属性,这个属性决定了Cookie的保存时间,服务器可以通过设定Expires/Max-Age字段的数值,来改变Cookie的保存时间。如果不设置该属性,或设为0,那么Cookie只在浏览网页期间有效,关闭浏览器,这些Cookie自动消失。
浏览器处理Cookie的方式
• 允许保存的数量
各个浏览器中会不同,同一浏览器版本也不同
IE8允许每个域保存50个cookie
Firefox允许每个域保存50个cookie
• 允许保存的大小
一般来说允许4Kb,不同浏览器,不同版本略有不同
• 当Cookie的数量达到上限时的删除方式
1:将最近使用最少的Cookie删除
2:随机删除
如何利用PHP生成Cookie
setcookie( )函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | /** * setcookie() 定义了 Cookie,会和剩下的 HTTP 头一起发送给客户端。 * 和其他 HTTP 头一样,必须在脚本产生任意输出之前发送 Cookie(由于协议的限制)。 * 请在产生任何输出之前(包括 <html> 和 <head> 或者空格)调用本函数。 * * 一旦设置 Cookie 后,下次打开页面时可以使用 $_COOKIE 读取。 Cookie 值同样也存在于 $_REQUEST。 * 比如$name 是'names',可通过$_COOKIE['names']获取它的值 * * $name string [Cookie 名称] * $value string [Cookie值 这个值存于用户的电脑里,请勿储存敏感信息] * $expire int [Cookie的过期时间 Unix时间戳 格林威治时间 如果设置成0 或者忽略参数 Cookie会在会话结束后过期] * $path string [Cookie有效的服务器路径 如果设置成'/'时 Cookie对整个域名domain都有效] * $domain string [Cookie的有效域名/子域名 例如设置成lcgod.com 那么对于www.lcgod.com都会生效] * $secure bool [设置这个Cookie是否仅仅通过安全的HTTPS连接传给客户端] * $httponly bool [设置成TRUE Cookie仅可通过HTTP协议访问 意思就是无法通过类似JavaScript的脚本语言访问] * @retrun bool 如果再调用本函数之前就产生了输出 setcookie()会调用失败并返回FALSE 反之亦然 */ setcookie( $name , $value , $expire , $path , $domain , $secure , $httponly ) |
调用setcookie( )示例
1 2 | //设置一个Cookie 名为'LCGOD'值为sessionID 有效期为7天 作用于服务器根目录 setcookie( 'LCGOD' , session_id(), time() + 60 * 60 * 24 * 7, '/' ); |
Cookie如何储存PHP数组或对象
因为Cookie无法直接储存PHP数组或对象 所以需要通过序列化( serialize( ) )和反序列化( unserialize( ) )来存取
五 Session
什么是Session
Session直接翻译成中文比较困难,一般都译成时域。在计算机专业术语中,Session是指一个终端用户与交互系统进行通信的时间间隔,通常指从注册进入系统到注销退出系统之间所经过的时间。以及如果需要的话,可能还有一定的操作空间。
具体到Web中的Session指的就是用户在浏览某个网站时,从进入网站到关闭浏览器所经过的这段时间,也就是用户浏览这个网站所花费的时间。因此从上述的定义中我们可以看到,Session实际上是一个特定的时间概念。
Session的一些特性
Session从用户访问页面开始,到断开与网站连接为止,形成一个会话的生命周期。在会话期间,分配客户唯一的一个SessionID,用来标识当前用户,与其他用户进行区分。
Session会话时,SessionID会分别保存在客户端和服务器端两个位置,对于客户端使用临时的Cookie保存(Cookie名称为PHPSESSID)或者通过URL字符串传递,服务器端也以文本文件形式保存在指定的Session目录中。
Session通过ID接受每一个访问请求,从而识别当前用户、跟踪和保持用户具体资料,以及Session变量(在Session活动期间,可在Session中存储数字或文字资料),比如session_name等等,这些变量信息保存在服务器端。
Session在PHP中如何使用
session_start( )
session_start( )函数开始一个会话或者返回已经存在的会话,判断客户端有无session_id,如果没有,那么就会在服务器端写入SESSION文件(或者通过数据库等完成)并且给客户端发送带有session_id的Cookie头信息。反之,如果客户端有session_id,那么就可以直接通过这个session_id找到之前的SESSION文件读取数据。
获取使用Session变量 与$_GET $_POST等变量的使用方法相同,$_SESSION['var']即可使用Session变量
session_id( ) 顾名思义,session_id( )函数就是用来获取设置session_id的
session_name( ) 同上 , 获取设置session_name
unset( $_SESSION['web'] ) 删除一个键值为'web'Session变量
$_SESSION = [ ] 删除所有Session变量 但是不删除Session文件
session_unset( ) 释放当前在内存中已经创建的所有$_SESSION变量,但不会删除Session文件以及不释放对应的session_id
session_destroy( ) 删除当前用户对应的session文件以及释放session_id,但不会删除内存中的当前的$_SESSION变量
session_save_path( ) 会话数据的路径。如果指定的路径,将数据保存到路径中。(in other words , 设置Session文件存放的路径)
服务器对Session的垃圾回收机制
在php.ini文件中可以设定Session垃圾回收的参数
###session.gc_probability = 1 [Session清除基数]
###session.gc_divisor = 100 [定义初始化会话时 , 启动垃圾回收程序的概率]
###session.gc_maxlifetime = 1440 [一次会话超过此参数所指定的秒数后 , 将被gc标记为垃圾 , gc启动时就会清理掉此次会话的Session文件]
gc启动的概率公式如下 : session.gc.probability / session.gc.divisor 对会话页面访问越频繁 , 概率就会越小 , 建议值为 1/5000 至 1/1000内
