PHP基础------会话控制
1. 什么是会话
其中: 逻辑关联是有一定顺序的, 不能是先有"结算"再有"下单".
2. 会话存在的意义
3. 会话是如何工作的
4. 会话控制的内容
5. 会话控制的几种方式
(1). 使用cookie实现会话控制:
(2). 使用 session实现会话控制:
(3). 其他:
---------------------------------------------------------------------------------------------------------------
①基于cookie的会话控制
----------------------------------------------------------------------------------------------------------------
cookie相关的知识点:
1. 在客户端,一个浏览器能创建的 Cookie 数量最多为 300 个,并且每个不能超过 4KB,
每个 Web 站点能设置的 Cookie 总数不能超过 20 个
2. cookie存储在用户本地浏览器上
3. 用户可以更改cookie的配置,安全性低
4. cookie的保存可以进行时间限定
-------------------------------------------------------------------------------------------------------------------
1. cookie的工作原理:
(1)在HTTP响应中设置cookie----->(2)在cookie的有效期内, 每次请求都会携带cookie的值----->(3)服务器识别并处理cookie的内容
2. cookie的生命周期:
(1)在HTTP响应中设置cookie:通过set-cookie指令设置cookie, 可以设置cookie的内容, 有效期, 有效路径等内容.
例如:
(2)在cookie的有效期内, 每次请求都会携带cookie的值: 只可访问域名相同, 路径匹配并在有效期内的cookie,
通过cookie指令发送具有访问权限的cookie值, 多个cookie的值用" ; "隔开.
例如:
其中: 第二个cookie的名字为user, 内容为admin........
(3). cookie失效:
①cookie自动过期
②用户手动在浏览器中清除cookie信息(.....设置->高级->删除cookie.....)
③服务器通过设置cookie的过期时间来控制cookie的有效性(将cookie过期时间设置为过去的时刻)
(4). 删除cookie:
①. 省略setcookie()函数的参数的除第一个参数(cookie名称)之外的所有列设置为空值, 这样就删除了名为XXX的cookie了;
②. 利用setcookie()函数将cookie设置为已过期的状态(第二个参数设置为空, 第三个参数设置为当前时间-1即可);
③. 把失效时间设置为0
3.cookie的使用:
(1) . 设置和修改cookie的值
bool setcookie( string $name, [, string value="" [, int $expires = 0 [, string $path = "" [, string $domain = "“ [, bool $secure = FALSE [, bool $httponly = FALSE] ] ] ] ] ]);
参数解释:
setcookie() 函数向客户端发送一个 HTTP cookie。
cookie 是由服务器发送到浏览器的变量。cookie 通常是服务器嵌入到用户计算机中的小文本文件。每当计算机通过浏览器请求一个页面,就会发送这个 cookie。
cookie 的名称指定为相同名称的变量。例如,如果被发送的 cookie 名为 "name",会自动创建名为 $user 的变量,包含 cookie 的值。
必须在任何其他输出发送前对 cookie 进行赋值。
如果成功,则该函数返回 true,否则返回 false。
参数 | 描述 |
---|---|
name | 必需。规定 cookie 的名称。 |
value | 必需。规定 cookie 的值。 |
expire | 可选。规定 cookie 的有效期。默认为0, 表示浏览器关闭时cookie失效 |
path | 可选。规定 cookie 的服务器路径。默认为空, 表示当前路径 |
domain | 可选。规定 cookie 的域名。默认为空, 表示当前的域名 |
secure | 可选。规定是否通过安全的 HTTPS 连接来传输 cookie。默认为FALSE, 若设置TRUE, 表示当前cookie只会在HTTPS安全环境中才会发送 |
httponly |
可选, 表示是否启用访问限制, 默认为FALSE, 若设置为TRUE, 表示无法通过脚本(如:JavaScript)来访问cookie的值, 只能通过HTTP协议来访问cookie的值 |
例如:
<?php $result = setcookie('username', 'admin', time()+60, "/", 'localhost'); if( $result ){ echo '设置成功!'; }else{ echo '设置失败!'; } ?>
结果:
在使用setcookie()函数时, 对于某些特殊字符, 如 "+"号, 将会被编码成特殊的符号, 但是对于已经编码的字符, 在服务器进行解码时也会被还原成原来的字符
如果在cookie中也不想这些字符被编码, 那么可以使用setrawcookie()函数.
例如:
使用setcookie():
<?php $result = setcookie('username', '1+1=3', time()+60, "/", 'localhost');
//$result = setcookie('username', '1+1=3', time()+60, "/", 'localhost');
if( $result ){ echo '设置成功!'; }else{ echo '设置失败!'; } ?>
将setcookie()函数改为setrawcookie():
4. 获取cookie的值:
使用: $_COOKIE["username"];
5. cookie的使用限制:
setcookie()函数定义了cookie, 会和剩下的http头一起发送给客户端. 和其它http头一样, 必须在脚本产生输出前发送
cookie(由于相关协议的限制), 因此, 要使用setcookie()函数, 必须在任何输出之前(包过<html>和<head>或者空格)调用本函数.
PHP5.4之后, 默认开启了输出缓冲区(定义在php.ini文件中), 控制php的输出, 当输出缓冲区开启的时候, 可以随意输出任何内容
这些内容都会被暂时存放在缓冲区中, 当脚本执行完成之后, php再将所有的缓冲区的内容组装成合法的http响应发送给客户端
因此, 即使在调用setcookie()函数之前, 已经输出了一些内容, 在组装成合法内容时, 也能被正确的组装在响应头中发送.
6. cookie使用中的安全建议:
(1). 设置合理的过期时间
(2). 设置必要的访问路径
(3). 设置合理secure和httponly属性
-------------------------------------------------------------------------------------------------
②. 基于session的会话控制
session通常被翻译成"时域", 为一个终端用户与交互系统进行通信的时间间隔, 一般指从注册进入系统到注销退出系统之间所经过的时间. Web中指用户在浏览某个网站所花费的时间.
A用户和C服务器建立连接时所处的Session同B用户和C服务器建立连接时所处的Session是两个不同的Session。
session存储在服务端。
session可以解决http短连接问题
session的工作原理:
- 一个session第一次被启用时, 一个唯一的标识被存储于本地的cookie中.
- 使用session_start()函数, PHP从session仓库中加载已经存储的session变量.
- 当执行PHP脚本时, 通过session_register()函数注册session变量.
- 当PHP脚本, 执行结束时, 未被销毁的session变量会被自动保存在本地一定路径下session库中, 这个路径可以通过php.ini文件中的session.save_path指定, 下次浏览网页是可以加载使用.
session的生命周期:
①.启用并设置session, 在http响应中设置客户端的唯一cookie, 将对应的session写入临时文件(服务器端)
②. 服务器读取并处理session, 客户端在http请求中携带cookie的值, 服务器通过cookie值定位到session文件, 读取并处理session文件的内容
③. session失效/清除(或用户手动删除cookie)
session的使用:
1. session_start()函数: 启用session.
实例化session, 然后设置session下的name值为admin, 代码:
<?php session_start(); $_SESSION['user'] = 'admin'; ?>
读写session: 使用$_SESSION数组将数据存入同名session文件中, 代码:
<?php session_start(); //$_SESSION['user'] = 'admin'; $_SESSION['user'] = array( "username" => 'admin', "age" => 12 ); var_dump($_SESSION);
2. 获取和设置session: string session_name([string name]);
获取和设置sessionID: string session_id([string $id);
获取和设置session文件的保存路径: string session_save_path([string $path]);
设置session中的cookie参数: bool session_set_cookie_params(int $lifetime [, string $path [, string $domain [, bool $secure = FALSE [, bool $httponly = FALSE]]]]);
3. 清空session的内容:
bool session_unset(void);
通过赋值的方式清空session 方法:$_SESSION = array();
4. 删除session(不仅仅是清空session, session文件也会被删除): bool session_destroy(void);
--------------------------------------------------------------------------------------------------------------------
cookie和session的比较:
相同点:
1. 是http协议的一个补充机制, 可以实现会话控制.
2. 可以标记用户, 客户端, 可以存储数据.
不同点:
1. 存储方式不同, cookie将数据存储到客户端里(浏览器), session将 数据存储在服务端(PHP临时目录)
2. 工作方式不同, cookie中利用http协议直接传输会话数据, session利用sessionID来定位会话数据(session中的数据更加私密)
3. 存储内容不同, cookie只可以存储简单的数据(例如:字符串), session可以存储复杂的数据(例如: 数组, 对象)