Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 67

会话技术

一、会话概述

1、什么是会话?

简单的讲: 用户打开一个浏览器访问网站,点击多个超链接,

访问服务器多个 web 应用的网页,然后关闭浏览器,整个过程

称之为一次会话。

会话---->谁跟谁会话?---->浏览器和服务器之间的会话!

2、什么是会话技术?

当用户用浏览器对服务器的 web 应用页面进行多次请求,将

交互过程中一些数据进行持久化存储的技术,以实现连续的业务

逻辑。这就是会话技术!

通俗易懂: 会话技术就是将用户的数据以文件的形式进行持久

化存储。

3、会话周期

从打开浏览器,输入网址,开始访问 web 应用页面,直至关

闭浏览器为止,这段时间称为会话周期。
4、会话技术分类

按照数据持久化存储的文件位置分为两种。

4.1 cookie 会话技术

把数据持久化工作交给 浏览器 来做。这个就是 cookie 会

话技术。

4.2 session 会话技术

把数据持久化工作交给 服务器 来做。这个就是 session

会话技术。

5、总结:

会话---->浏览器和服务器会话---->会话产生数据 ---->

数据文件形式存储!

会话技术: 就是实现进行跨脚本数据共享的一种解决方案!

会话操作: 增 删 改 查 判

二、Cookie 会话技术

Cookie 是客户端技术,把数据持久化工作交给 浏览器 来做。就

是 cookie 会话技术。
1. 当浏览器第一次当问 a.php 的时候, 服务器会向浏览器发送设置

cookie 的信息

2. 浏览器接收到 cookie 信息后,浏览器将数据以文件(cookie 文

件)的形式保存到指定的目录中。

3. 当浏览器再次(包括以后)请求其他.php 或者服务器其他的资源的

时候,浏览器会自动携带刚才设置的 cookie 信息。

4. php 脚本可以通过超全局变量 $_COOKIE 来获取 cookie 中的数

据。
1、发送 Cookie&获取 Cookie

1.1 setcookie()函数

setcookie() 发送 Cookie

setcookie ( string $name [, string $value = "" [,

int $expire = 0 [, string $path = "" [, string $domain

= "" [, bool $secure = false [, bool $httponly =

false ]]]]]] ) : bool

参数:

$name: Cookie 名称,设置数据在 cookie 中键名。

$value: Cookie 值, 需要存储的数据。

$expire: Cookie 的过期时间,单位秒。默认是: 关闭

浏览器,cookie 失效。时间格式: 当前时间戳+过期时

$path: Cookie 有效的服务器路径

设置 "/",Cookie 对整个域名对应的根目录及其

子目录有效

设置 "/foo", Cookie 仅仅对域名对应的根目录

/foo 目录及其子目录有效

默认值是设置 Cookie 的脚本所在当前目录有效。

$domain: Cookie 的有效域名/子域名

设置成 "baidu.com" ,Cookie 对整个域名有效


(包括它的全部子域名)

设置成 "www.baidu.com",Cookie 只对这个子

域名以及三级域名有效

设置成 "tieba.baidu.com",Cookie 只对这个子

域名以及三级域名有效

返回值:

成功返回 true, 失败返回 false

1.2 获取 Cookie

服务器 php 脚本中,所有的 Cookie 存储在 $_COOKIE

超全局变量。

可以通过 $_COOKIE['name'] 获取 Cookie 的值。

可以理解 $_COOKIE 就是一个关联数组。Cookie 的名称

为 键名。 Cookie 的名称对应的数据为 值。

php10/setcookie.php
1.3 浏览器访问

为什么第一次访问报错,没有获取 Cookie 中的数据? 第

二次访问可以获取 Cookie 中的数据?

浏览器第一次访问 php10/setcookie.php

浏览器再次访问 php10/setcookie.php

因为浏览器第一次向服务器发送请求的时候没有携带 Cookie 数据。

1.4 新建 get_cookie.php

新建 get_cookie.php。获取 Cookie 中的数据!

php10/get_cookie.php
1.5 查看浏览器(chrome)中的 Cookie 信息

1、浏览中查看 cookie 的信息


2、Chrome 浏览器 cookie 文件存放位置

C:\Users\admin\AppData\Local\Google\Chrome\

User Data\Default\Cookies
注意: 不同浏览器 Cookie 无法共享,Chrome 浏览器的 cookie

火狐浏览器访问不了,火狐的浏览器 ie 访问不了。总之哪个浏览器

访问哪个浏览器的 cookie。

2、Cookie 保存的数据类型

cookie 中的保存的数据类型可以为: 字符串、整型、浮点型。

cookie 中的保存的数据类型不能为: bool、null、数组、资

源、对象,都不可以!!!

2.1 字符串、整型、浮点型

php10/cookie_str.php
使用 Chrome 浏览器开发者工具查看 浏览器 请求服务器附带的

Cookie 信息。
2.2 不能保存 Bool 类型

php10/cookie_bool.php
2.3 不能保存 NULL 类型

php10/cookie_null.php
2.4 不能保存数组类型

保存数组类型数据。直接报错。

php10/cookie_array.php
2.5 总结: cookie 只能保存字符串

3、Cookie 支持下标存储数据

Cookie 中无法存储数组类型数据。但是在服务器端 PHP 可

以将同名的 cookie 转换成数组。

php10/cookie_key.php
php10/cookie_get.php
4、修改 Cookie 的值

setcookie('name', $newvalue)

5、删除 Cookie

php10/cookie_delete.php
6、Cookie 过期时间

Cookie 可以分为两类:

临时性 Cookie:关闭浏览器,cookie 就销毁。

有过期时间 Cookie:关闭浏览器,cookie 不销毁,在临

时 cookie 基础上添加过期时间。

6.1 临时 Cookie
setcookie ( string $name , string $value) 不设置第三

个参数过期时间就是临时 cookie!

php10/temp_cookie.php

php10/get_temp_cookie.php

关闭浏览器,再打开浏览器,直接访问

get_temp_cookie.php。Cookie 无效了!
6.2 有过期时间 Cookie

setcookie ( string $name, string $value, int $expire )

参数$expire: 设置 Cookie 的过期时间,单位秒。时间格

式: time()+过期时间(时间戳 int 型)

php10/cookie_expire.php
7、Cookie 的有效时间

也就是设置 Cookie 的过期时间。

setcookie ( string $name, string $value, int $expire )

参数$expire:
Cookie 的有效期(过期时间),时间格式: time()+时间戳

(int 型),单位: 秒

7.1 设置 cookie 有效时间为 1 小时

php10/cookie_time.php
7.2 设置 cookie 有效时间为过去时间点,表示删除一个

cookie
8、Cookie 的有效目录

setcookie ( string $name , string $value, int $expire,

string $path ) : bool

第四个参数:

$path: Cookie 有效的服务器路径

设置 "/",Cookie 对整个域名对应的根目录及其子目

录有效

设置 "/foo", Cookie 仅仅对域名对应的根目录 /foo

目录及其子目录有效
默认值是设置 Cookie 的脚本所在当前目录有效。

8.1 默认有效目录

默认情况下,cookie 只能在设置 cookie 文件的当前目录

及子目录下起有效。

php10/cookie_path.php
8.1 设置有效为根目录

php10/cookie_path.php
9、Cookie 的有效域名

扩展域名知识:

域名---->www.baidu.com---->访问网站

域名可以分为:顶级域名 一级域名 二级域名 三级域名

.....

baidu.com 顶级域名

www.baidu.com 一级域名

new.baidu.com 一级域名

mp.weixin.qq.com 二级域名

域名从地区上分分为:

国别域名:从域名上可以区分国家

中国的.cn 美国的.us 俄罗斯的.ru

国际域名:从域名上不能区分那个国家

.com: 表示公司 company,商业相关

.net: 表示与网络有关的公司

.org: 表示非盈利组织

....

setcookie ( string $name , string $value, int $expire,

string $path, string $domain ) : bool

第五个参数:

$domain: Cookie 的有效域名/子域名


设置成 "baidu.com",Cookie 对整个域名有效(包

括它的全部子域名)

设置成 "www.baidu.com",Cookie 只对这个子域名

以及三级域名有效

设置成 "tieba.baidu.com",Cookie 只对这个子域名

以及三级域名有效

php10/cookie_domin.php
10、Cookie 是否安全传输(了解)

setcookie ( string $name , string $value, int $expire,

string $path, string $domain, bool $secure ) : bool

第六个参数:

$secure: Cookie 是否仅仅通过安全的 HTTPS 连接传给

客户端,默认值 false。

设置 true : Cookie 只能通过 https 进行传输,不能

通过 http。

设置 false : Cookie 能通过 http 进行传输,也能通过

https 传输。

http://www.liujianphp.com/ 大部分网站打开之后都是 http

开头

https://www.baidu.com/ 百度-->是以 https 开头

https 比 http 更加安全!

php10/cookie_secure.php
11、Cookie 是否安全访问(了解)

Cookie 是以文件的形式包数据存储在浏览器指定目录。

Cookie 除了通过 HTTP 请求传输给服务器,也可以通过前端

脚本语言 JavaScript 访问。

setcookie ( string $name , string $value, int $expire, string

$path, string $domain, bool $secure, bool $httponly ) : bool

第七个参数:

$httponly: Cookie 是否仅可通过 HTTP 协议访问。默

认 false。

设置 true : Cookie 只能通过 HTTP 协议 进行访问。


设置 false : Cookie 无法通过类似 JavaScript 这样

的脚本语言访问。

设置 $httponly 为 false

php10/cookie_httponly.php

php10/cookie_httponly_get.php
设置 $httponly 为 true

12、Cookie 的特点

1. cookie 保存在客户端,相对安全性不高。

2. 浏览器对 cookie 存储的数据大小有限制,一般 4kb。

3. 浏览器每次请求都要附带 cookie 信息,如果 cookie 过多,


数据量多大。进行网络传输时,占用带宽!

4. 浏览器可以禁止 cookie。如果用户禁止 cookie,涉及到

cookie 的功能就用不了。

5. cookie 只支持字符串类型

6. 不同的浏览器存储不同的 cookie

13、Cookie 应用

1. 网站中常用来记住登录信息(用户名和密码),或者叫保存

登录状态,或者叫下次自动登录。

2. 浏览过的商品或者叫你的足迹

3. 总之 cookie 用来跟踪客户端状态

三、Session 会话技术

session 是服务器端技术,把数据持久化工作交给 服务器 来做,

可以保证数据的安全和夸脚本数据共享,这个就是 session 会话技

术。
1. 浏览器不可以随意的访问 session 数据,浏览器需要一个 身份验

证信息 才可以访问 session 数据。

2. 如果有身份验证信息,服务器端的 session 中数据是可以共享的,

a.php 脚本可以访问 session 中数据,b.php 脚本也可以访问

session 中数据。

1、开启 session

1.1 自动开启 session

自 动 开 启 session , 需 要 修 改 php.ini 中 的
session.auto_start = 1

当运行 php 脚本的时候就开启 session。

注意: 如果使用自动开启 session,这样每个 php 脚本

在运行的时候都会开启 session,会消耗系统资源。也就是

说并不是每个 php 脚本运行的是都要开启 session,所以在

需要的时候,可以使用系统函数启动 session。

1.2 开启 session 函数

session_start() 开启 session,在需要的脚本中使用次函

数开启 session!

php10/session_start.php

1.3 Session 文件

当浏览器访问了有 session_start()的 php 脚本之后,php


就会在服务器中会创建一个 session 文件,用来存储 session

中的数据。

可以通过 php.ini 中的配置项 session.save_path 修改

session 文件存储目录,默认是在 c:/windows/temp

注意: 修改完毕之后。重启 apache

创建 session 文件存储目录: E:/wamp/tmp

再次访问 session_staart.php,查看 sessioon 文件


2、Session 的操作

开启 Session 之后。可以通过 $_SESSION 超全局变量操作

Session 中的数据。

2.1 存储数据到 Session 中

$_SESSION['name'] = value;

php10/session_save.php
查看 session 文件中保存的数据

2.2 读取 Session 中的数据

1、获取 session 中的一个数据


$var_name = $_SESSION['name'];

php10/session_get.php

2、获取 session 中的所有的数据

$sess_data = $_SESSION; 这个是时候 $_SESSION

可以视为一个 关联数组。

php10/session_get_all.php
2.3 修改 Session 中的数据

$_SESSION['name'] = new_value;

3、删除 Session

3.1 删除 Session 某个数据

unset($_SESSION[‘name’]) 或 者

$_SESSION[‘name’] = null;

3.2 删除 Session 中所有的数据

$_SESSION = array() 或者 $_SESSION = null;

3.3 销毁 Session 会话
session_destroy() 调用此函数会销毁 session 会话--->

删除 session 文件。

4、session 运行机制

第一步:

使用 session_start() 函数开启 session 会话。

第二步:
当客户端浏览器第一次访问,服务器会给客户端浏览器 Session

会话的编号也就是 session_id,浏览器将这个 sessiond_id 保存在

Cookie 中,session_id 保存在 Cookie 中名称: PHPSESSID

第三步:

再次访问或者以后的访问 web 应用,浏览器都会把 Cookie 中没

有过期 PHPSESSID 对应的 session_id 通过请求附带传给服务器,

服务器对应的程序中只要开启了 Session,就会通过 session_id 来

识别用户(浏览器),然后在 Session 文件存储目录查找对应的

Session 文件。

第四步:

在 PHP 中,通过 $_SESSION 超全局变量完成 Session 会话中

的数据操作。操作。

session_id 是服务器识别客户端用户身份的唯一信息。所以每个客

户端用户只能访问自己的会话,不能访问别人的会话。

注意: Session 会话技术是基于或者依赖 Cookie 会话技术的!


4.1 Session 会话的编号

session_id() 获取 session 会话的 session_id。

php10/session_id.php

4.2 获取会话的名称

session_name() 获取会话的名称。也就是 session_id 在

Cookie 中保存的名称。

php10/session_name.php
5、php.ini 中关于 session 的配置项

5.1 Session 基本相关配置项目

1、session.auto_start = 0 是否自动开启 Session 会

2、session.save_handler = files 设 置 Session 会 话

中的数据存储方式,默认: 文件形式

3、session.save_path = "E:/wamp/tmp" Session 文

件保存路径
4、session.gc_maxlifetime = 1440 Session 会 话 过

期时间,默认 1440 秒。会话过期,Session 文件会被视为垃

圾文件。

5.2 Session 会话名称在 Cookie 中的配置项

Session 会话的 session_id 是通过 Cookie 在浏览器与服

务器之间传递的。

在 php.ini 中对 Cookie 中保存的 session_id 的信息进行

一些配置。

1、session.use_cookies = 1 在 Session 会话中是否

使用 Cookie 来保存 session_id

2、session.use_only_cookies = 1 是 否 强 制 Session

会话使用 Cookie 来存储和维护 session_id

3、session.name = PHPSESSID 设 置 session_id 保

存在 cookie 中名字

4、session.cookie_lifetime = 0 设 置 session_id 在

客户端 cookie 中保存的时间。

0 表示关闭浏览器存储 session_id 的 cookie 就失效

5、session.cookie_path = / 设 置 保 存 session_id

保存在 cookie 中有效目录。

6、session.cookie_domain = 设 置 保 存 session_id

的 cookie 有效域名
7、session.cookie_httponly = 设置保存 session_id 的

Cookie 是否通过 HTTP 协议访问。

5.3 解决 session.cookie_lefttime = 0 导致的问题

session.cookie_lefttime = 0

设置此配置想值为 0,会导致关闭浏览器,存储

session_id 的 ookie 就是失效了,也就是再次打开浏览器的

时候。

在请求附带的 Cookie 中就没有 session_id 传输给服务器,

服务器得不到 session_id,就无法是被对应的 Session 会话

以及查到对应的 Session 文件。

但是在程序又使用 session_start()开启 Session 会话,这

个时候服务会开启一个新的 session 会话!

php10/session_cookie_lefttime.php

第一次访问:
关闭浏览器。然后进行第二次访问,并且获取 Session 中数据。
解决方案:

session.cookie_lifetime 配置项目设置的时间和

session.gc_maxlifetime 一致!!
注意重启 apache。

关闭浏览器。再次访问并获取 Session 中的 ok 的数据


6、session 垃圾回收机制

当开启 session 会话,服务器会在指定目录创建 session 文

件。

如果会话已过期,此时 Session 文件失效,php 就是把失效

的文件视为垃圾文件,那么垃圾文件怎么删除呢?

Session 会 话 过 期 , 失 效 的 文 件 不 会 立 刻 删 除 , 是 通 过

Session 的垃圾回收机制删除失效文件。
当开启一个 Session 会话时:

PHP 会根据 php.ini 配置文件中 session.gc_probability

和 session.gc_divisor 两个配置项的值,来决定是否启动一

个 GC(Garbage Collector)。

默认情况下:

session.gc_probability = 1

session.gc_divisor =1000

也 就 是 说 有 千 分 之 一 概 率 可 能 性 会 启 动 GC 清 除 过 期 的

session 会话文件。

可以通过 php.ini 或者 ini_set()函数来修改:


四、Cookie 和 Session 的区别与联系(重点)

1、相同点

1. 都是会话技术,cookie 是客户端技术,session 是服务器

端技术

2. 都有会话的生存周期

3. 都是把数据以文件的形式保存,实现数据跨脚本共享

2、区别

cookie ses

文件存储位置 客户端 服务

保存数据大小 4K 没有

支持数据类型 字符串和数字 除了资源以为

数据安全性 低 高

3、联系

session 会话是基于 cookie 会话的,也就是 session 会话中

的 session_id 通过 cookie 来进行传递的,所以客户端浏览器禁

用 COOKIE 后,SESSION 无法正常使用。


五、客户端浏览器禁用 Cookie 对 Session 的影响

1、客户端浏览器是可以禁用 cookie 的

客户端禁止了 cookie 之后出现的问题:

1、客户端浏览器不会把数据存储在 Cookie 中

2、浏览在发送请求的不会附带 Cookie 数据

IE 浏览器禁用 Cookie

Chrome 浏览器禁用 cookie


2、Cookie 禁用对 Session 影响

如果客户端浏览器禁用了 Cookie,Session 是无法正常使用

的,因为浏览器和服务器是通过 Cookie 来传递 Session 会话的

唯一标识 session_id 的,并且服务端也是无法控制客户端是否

禁用 Cookie。

Chrome 浏览器禁用 Cookie


php10/session_test.php
php10/session_test2.php
那么 session 会话依赖的 session_id 如何传递呢?

3、解决方案: 通过 URL 地址传值方式传递 session_id

3.1 修改 php.ini 配置文件

session.use_only_cookies = 0 表示 Session 会话不仅仅

依赖于 Cookie 会话。

session.use_trans_sid = 1 表示运行通过其他方式传输

session_id。
3.2 通过 ini_set()函数动态修改

php10/session_url.php

3.3 通过 URL 地址传递 session_id

php.ini 配置完毕或者动态设置完毕之后,php 在返回给

浏览器页面中的所有的 URL(以 http://开头的 url 地址除外)


地址后自动补上 session_id 数据,也就是通过地址栏 GET

方式传递 session_id。

php10/session_url.php

php10/data.php
3.4 表单传递 session_id

如果是表单,则在表单中自动添加一个隐藏域用来传递

session_id。

php10/session_form.php

You might also like