Session 入门 学习 详细教程

时间:2022-09-29 14:53:11

1,Session技术

1.1,Cookie的不足

Cookie是将会话数据,直接存储浏览器端。带来了:

问题一:安全性

问题二:数据传输。大量的会话每次都需要从浏览器端传输到服务器端。限制了浏览器端可以存储的会话数据量。

 

1.2,Session原理

将会话数据存储在服务器端。需要解决如何区分不同浏览器的会话数据问题。

方案如下:服务器端为不同的会话数据分配唯一的标志,浏览器去存储该标志。

 

 

 

1.3,基本操作

1.3.1,开启session功能

session_start()

操作session之前,一定要先开启session!

1.3.2,操作session数据

超全局$_SESSION数组,完成session数据的全部管理,增,删,修改,获取!

 

设置:

Session 入门 学习 详细教程

 

获取:

Session 入门 学习 详细教程

 

就像操作一个普通的数组一样,操作session即可!

1.4,Session标志,session-ID

一:session_id存储在浏览器端的cookie中,就是一个普通的cookie变量(他具有所有的cookie变量具有的属性)

二:服务器PHPsession功能,负责生成session-ID,并以cookie的形式,分配到浏览器前端。

 

查看浏览器已经存储的cookie中的session-ID: 

如果浏览器没有携带session-ID:

响应数据中,就一定会重新分配 

Session 入门 学习 详细教程

如果浏览器存在,则    请求时携带到服务器端,服务器端不需要再生成了:

1.5,服务器端session数据区

默认情况下,session数据区是位于服务器所在操作系统的临时目录中,以独立文件的形式进行存储的。

存储位置基于配置:

Php.ini

 

Session 入门 学习 详细教程

Session 入门 学习 详细教程

 

1.6,Session数据的属性

Session数据的属性,是依赖于session对于的session-Id这个cookie变量的属性的。

例如有效期

由于session-ID这个cookie变量的有效期为会话周期,也导致session数据在浏览器关闭后立即失效!

其他的cookie变量具有的属性都是影响session-id的:

例如:

 

Session 入门 学习 详细教程

由上可见:session的默认属性为:

当前域名下,有效。

整站有效。

浏览器关闭失效。

设置session数据

我们也有办法设置session-id这个cookie变量的属性

setcookie(PHPSESSID);

 

方案一:推荐!

session_set_cookie_params(有效期,有效路径,有效主机,安全,httponly);

设置属,一定在 开启session机制之前!

 

Session 入门 学习 详细教程

 

 

强调,实操中,有效期,有效路径,等属性都是不需要修改的。

 

方案二:修改PHP的配置项

Session.cookie_lifetime有效期

Session.cookie_path有效路径

Session.cookie_domain有效域名

Session.cookie_secure,仅仅安全连接下传输(安全)

Session.cookie_httponly

 

选择修改配置文件,使得当前php服务器上所有的项目都统一session属性的默认值(不推荐)

配置项修改函数 ini_set(),在脚本周期内,修改某个配置项的值!(推荐)

 

1.7,$_SESSION 域 和session数据区(文件)关系

_SESSION变量的产生:在session_start时

如图所示:

Session 入门 学习 详细教程

Session 入门 学习 详细教程

 

1.8,销毁session,session_destory()

函数session_destory(),销毁session。

①   关闭session机制。(后期关于session的处理不再执行)《=》session_start

②   删除当前session对于的数据区文件。

导致,下个脚本周期。访问不到任何的session数据!

 

通常,退出,注销。当不需要整个会话的session数据时,可以选择销毁session!

 

 

销毁session的函数,仅仅完成删除对于的session数据区(文件),但并不能同时删除$_SESSION数组,以及浏览器端的session-ID;

完全销毁session

通常逻辑上的销毁session,应该将于当前session相关的全部内容都删除,才合理:

应该同时删除,session-id,$_SESSION变量,session数据区都删除才可以:

其中:PHPSESSID,这个名字是可能被配置修改的!

Php 的配置:

通用的做法使用函数:session_name()来获取当前配置的session.name的值!

 

 

以上的语法细节:

Unset($_SESSION);删除session变量,不能独立使用。

如果想 清空所有的session数据时,不能使用,而应该:$_SESSION = array();

 

1.9,垃圾回收

存储于服务器端的session数据区,当满足垃圾条件时,被删除,回收可用的存储空间!

 

一:如何判定垃圾?

如果某个数据区(文件)超过有效期未被使用,则被视为垃圾数据区。

默认的有效期为:1440s,可以被配置的:

 

最后修改时间,有效期,当前时间 判断出来是否为垃圾:

垃圾:当前时间-最后修改时间 > 有效期。(最后修改时间 < 当前时间-有效期

 

 

二:如何删除这些垃圾?

在开启session时(session_start())就会有一定的概率 触发 垃圾回收操作!

默认的概率是1/1000,可以被配置:

可能性:

基数(除数):

 

测试时,调整概率和有效期时间,来测试!

 

Session 入门 学习 详细教程

执行几次后,就会删除掉过期的数据区

 

 

1.10,Session存储机制的重写

由其他方式存储session数据。默认是文件的方式。实操时:还有 数据库,内存管理器

两个原因致使需要修改session的存储机制:

1:大量的session需要管理。

2:多web服务器共享session。

 

 

 

1.10.1,一:提供可存储操作的函数(方法)

共有6个,四个与存储直接相关,两个辅助。

Session 入门 学习 详细教程

以上函数,仅仅需要负责定义,而不需要负责调用。

Session 入门 学习 详细教程

PHP核心程序,在需要的时候完成调用!

1.10.1.1,创建session数据表

每个表中的记录,相当于原来的一个session文件。

结构如下:提醒  字段注释 -- 前后有空格   或者 用/*  */

 

Session 入门 学习 详细教程

Session 入门 学习 详细教程

增加索引:Alter table session add index (last_write)

1.10.1.2,读操作

注意:

该方法,会在被调用时自动获得当前的sessionid

该方法,需要返回字符串,即使没有获取成功,也需要空字符串!

该方法,仅仅需要返回字符串数据即可,不需要对其反序列化,系统会处理。

1.10.1.3,写操作

Replace into语法上与

insert  into一致

如果主键(唯一键)冲突,则会选择执行替换更新操作,如果未冲突,就是insert。

 

If (select) {

        Update

} else {

        Insert

}

 

Unix_timestamp();

 

测试:

写成功了:

 

读呢?测试读操作

 

1.10.1.4,删除

 

1.10.1.5,垃圾回收Gc

如果字段参与运算,最好独立在不等式的一侧,可以更好的利用该字段上的索引(如果有)

Session 入门 学习 详细教程

Alter table session add index (last_write)

 

 

1.10.1.8,重新设置配置项session.save_handler

session.save_handler:表示存储处理机制

默认的:

表示以文件的形式存储。

 

修该改为user,表示:表示自定义!

 

1.10.1.9,先设置session_set_save_handler(), 再开启session

切记:关闭session的自动开启。

配置项:session.auto_start表示自动开启!

 

1.10.2,二:将其告知给PHP程序

函数:

session_set_save_handler(开始,结束,读,写,删除,垃圾回收);

每个参数,就是回调函数(函数标志类型的参数)!

 

 

1.10.3,三:常规使用session即可:

开启session,操作$_SESSION; 


 

 

2,会话技术综述

2.1,Session pk cookie?

联系:

        都是会话技术的实现。

        Session基于cookie,session的session-id存储于cookie中。

差异:

       

 

Cookie

Session

会话数据的存储位置

浏览器端

服务器端

安全性

传输会话数据量

对数据类型的支持

仅字符串

序列化存储,全部数据类型(资源不行)

 

 

2.2,cookie禁用,session如何处理?

正常情况:cookie禁用,session也不能用!

 

理论情况:

只要能过每次请求向服务器传输session-id,那么没有cookie也可以…

通过,url(get)或者表单元素(post),向服务器传递session-id即可。

Php,支持配置通过非cookie方式传递session-id的(公共环境不建议设置)

两个配置项:

是否仅仅使用cookie传递session-id:

Session 入门 学习 详细教程

是否自动通过非cookie的方式传递session-id:

Session 入门 学习 详细教程

 

测试:

设置浏览器不支持cookie:

页面入下:

 

Session 入门 学习 详细教程

结果:

Session 入门 学习 详细教程

Html代码被更新为添加session-id:

 

 

2.3,如何持久化session?

理论上:

一:持久化cookie中的session-id。

二:延长对session垃圾的判定时间。

 

Session_set_cookie_params(24*3600);

Ini_set(‘session.gc_maxlifetime’, 24*3600);

 

没这么做的。Session不需要持久化。

服务器的session处理压力增大!

 

建议:需要持久化存储会话数据,选择cookie!

会话:session。