php学习笔记11:SESSION

SESSION

SESSION基本使用

session原理

session与浏览器无关,但是与cookie有关.

1. php碰到session_start()时开启session会话,会自动检测sessionID;

1.1如果cookie中存在sessionID,则使用现成的;

1.2如果cookie中不存在sessionID,创建一个sessionID,并通过响应头以cookie形式保存到浏览器上

2. 初始化超全局变量$_SESSION为1个空数组

3. php通过sessionID去指定位置(session文件存储位置)匹配对应的文件

3.1不存在该文件:创建一个sessionID命名文件;

3.2存在该文件: 读取文件内容(反序列化),将数据存储到$_SESSION中

4. 脚本执行结束,将$_SESSION中保存的所有数据序列化存储到sessionID对应的文件中

启用session,需要开启session(脚本使用到$_SESSION就开启1次)

$_SESSION是通过session_start()函数调用时才会定义的:

如上,直接使用$_SESSION会发现其未定义.

session使用需要先调用session_start()

设置session信息

  • 如果想存储数据到session中,那么只要不断给$_SESSION数组添加元素即可.

读取session信息

  • 读取$_SESSION数组即可获取session信息

会话技术的本质是为了实现跨脚本共享数据:在一个脚本中定义数据,在其他脚本中可读取数据.

我们新开1个脚本文件读取上一个脚本的session:

此时我们按浏览器F12"开发者选项"查看:

删除1个session信息:

删除session就是将session数据清理掉(让$_SESSION拿不到)

删除指定session: unset($_SESSION['某元素下标']);

删除所有session信息

删除所有session信息就是让$_SESSION变成空数组

session相关配置(php.ini)

session基础配置

  • 1. session.name : session名字,保存到cookie中sessionID对应的名字

  • 2. session.auto_start : 是否自动开启session(无须使用session_start()函数开启).默认为关闭
  • 3. session.save_handler :session数据默认的保存方式,默认是文件形式

  • 4. session.save_path: session文件默认存储的位置.默认没有开启,说明借用操作系统的临时文件存储.

使用系统的文件夹存储并不安全,我们需要指定一个存储文件夹.用户可根据实际需要自行指定一个存储文件夹.

session常用配置

  • 1. session.cookie_lifetime:php sessionID对应的cookie生命周期.默认生命周期0指至会话结束(浏览器关闭)

  • 2. session.cookie_path sessionID在浏览器存储之后允许服务器访问的路径(cookie作用范围),默认是全站

  • 3. session.cookie_domain: sessionID对应的cookie允许访问的子域范围(是否可以跨子域).默认只能当前主机访问,禁止跨子域.

配置的两种形式

  • 1. php.ini中配置:修改php.ini
  • 2. 脚本中配置:php可以通过ini_set()函数来在运行中设定某些配置项(只会对当前运行的脚本有效).把这种配置称之为项目级.

ini_set:ini_set()函数: 为一个配置选项设置值.设置指定配置选项的值。这个选项会在脚本运行时保持新的值,并在脚本结束时恢复。

格式:ini_set ( string $varname , string $newvalue ) : string

参数: varname 指定配置项.(注意:不是所有有效的选项都能够用 ini_set() 来改变的。 这里有个有效选项的清单附录); newvalue 设置配置选项新值。

返回值:成功时返回旧的值,失败时返回 FALSE

例如在脚本中设置一个选项:

销毁session

session删除只是删除session数据,$_SESSION看不到而已.销毁session是指真正物理删除session对应的session文件.

session_destroy()函数:根据session_start()得到的sessionID去寻找对应的session文件并删除.

session垃圾回收机制

session垃圾回收机制原理

垃圾回收参数设置:

1. session.gc.maxlifetime = 1440 : 规定session文件最大生命周期是1440秒

2. session.gc.probability = 1 : 垃圾回收概率因子(分子)
probability 英[ˌprɒbəˈbɪləti]美[ˌprɑːbəˈbɪləti] n.可能性; 或然性; 很可能发生的事; 概率; 几率; 或然率;

3. sesson.gc.divisor = 1000 : 垃圾回收概率分母

禁用COOKIE后使用session

禁用cookie后不能使用session的原因

session技术需要利用cookie来保存sessionID. 从而使得php可以跨脚本时得到相同sessionID,从而访问同一个session文件.

示例:我们关闭浏览器cookie看看效果,如下:

我们在脚本1中设置session,如下:

我们在脚本2中读取session,如下:

运行脚本1,服务器产生session文件,如下:

运行脚本2,服务器产生新session文件,并没有读取其他脚本产生的原session文件,如下:

解决思路:最终让session_start开启之前拿到先前脚本产生的原来的sessionID(而不是再产生1个新sessionID).

实现无cookie使用session

方案A:利用php提供的函数:session_id和session_name来获取/设置sessionID和name.从而解决session_start总是产生新sessionID的情况.(手动操作)

  • 1.在session保存数据的脚本中获取sessionID和名字:

  • 2. 想办法将数据传递给其他脚本:表单传值(url或者form表单)

  • 3. 在其他(接收session的)脚本中接受数据.为了阻止session_start产生新的sessionID.需要使用session_id函数设置读取到的id

方案B: 利用session机制中已经提供的解决方案自动操作(配置)

原因1:默认session配置只允许使用cookie保存sessionID

原因2:默认关闭了其他能够传送数据的方式,只保留了cookie:

  • 1. 修改php.ini配置文件,开启其他方式传输sessionID.关闭[ 只允许使用cookie传输功能 ].

需要更改为:session.use_only_cookies = 0

需要更改为: session.use_trans_sid = 1

  • 2. 一旦配置开启,php会自动将sessionID和session名字在其他位置绑定数据.同时还会在session_start的时候,考虑其他方式(表单)传递数据,而不是只有cookie.

如上,效果和方案A一样,只是免于手工保存/获取sessionID和名字.(由PHP系统自动完成)

总结:网站实际开发禁止使用[禁用cookie时使用session].不建议修改以上PHP.INI配置.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值