header-bg.jpg
深入浅出PHP会话控制(Session与Cookie)
发表于 2018-01-09 20:45
|
分类于 PHP
|
评论次数 0
|
阅读次数 1987

attachment/2018/01/09/60031515501689.jpg

一 序言

SessionCookie是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/50001/1000

发布评论
还没有评论,快来抢沙发吧!