php_会话技术 — session

Posted 张八百_php学习笔记

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了php_会话技术 — session相关的知识,希望对你有一定的参考价值。

  session:将会话数据存储在服务器端,并且让数据能够识别浏览器的一种技术。
  原理图:

  

  通过分析原理图:
  1)会在服务器开辟SESSION会话数据区保存会话数据;
  2)开辟会话数据区后,将会生成一个唯一的phpSESSID,并且返回给浏览器作为一个COOKIE数据。

  session的使用 -- 基本操作
  1.要使用session,必须先开启SESSION机制,使用session_start()函数

#开启session
session_start();

  2.增删改查操作

  我们可以通过操作$_SESSION数组变量来增删改查SESSION数据

  

  我们还可以通过配置php.ini中session.auto_start配置项来开启SESSION机制。默认情况下,配置的值为0,表示不自动开启,我们可以修改为1,来开启自动开启SESSION机制。

  (项目中不推荐使用这种方式,我们并不是所有程序页面都需要使用SESSION数据,什么时候需要就什么时候开启)

  $_SESSION变量和SESSION会话数据区的关系

  

  通过分析原理图:
  1)会话数据存储在服务器的会话数据区中;
  2)Session_start时,如果没有会话数据区将会开辟一个新的会话数据区;如果有,则找到该数据区,将其中的数据取出来初始化给$_SESSION变量。(没有的时候初始化为空数组)
  3)只有当程序运行结束时,才会将$_SESSION中的数据保存到会话数据区。
  4)我们程序将自动通过PHPSESSID区查找对应的会话数据区。

  销毁SESSION数据(区)操作

session_destroy();

  注意:session_destroy销毁的是SESSION会话数据区,并没有直接操作到$_SESSION。

  SESSION属性的设置
  本质上是控制PHPSESSID来达到控制整个SESSION会话数据区中所有会话数据的属性。
  PHPSESSID不是我们手动创建的,而是PHP自动帮我们创建的,如果我们要修改PHPSESSID这条COOKIE数据的属性,我们需要通过PHP来进行相关的控制,而不是通过setcookie函数来进行相关的设置。
  有效期
  默认值为0,表示一个会话周期。
  一个会话周期:表示到关闭浏览器为止为一个会话周期。
  有效路径
  区别于普通COOKIE数据,PHPSESSID默认的有效路径为全站有效。
  有效域
  默认的是当前域有效。
  是否安全传输
  默认的是http和https都能访问。
  HTTPONLY
  这个属性对SESSION数据无意义
  对应的在php.ini中的配置项为,如下图:

  

  

  1)我们通过直接配置,不方便(可能经常要找运维人员); 2)另一个也不符合我们个性化的管理(一台服务器可能部署多个网站,修改配置将会影响到所有网站)

  所有PHP还支持我们在程序中自定义控制属性。通过函数session_set_cookie_params函数来进行设置。参数对应着PHPSESSID这个COOKIE的五个属性。

  

  TIPS:这个函数在指定第一个有效期参数时,有可能需要在不同环境增加或者减少时间戳来测试,这个是该函数的一个小bug。

  

  禁用COOKIE后如何使用SESSION

  我们可以通过php.ini文件的相关配置来开启另一种使用SESSION的机制。

  下面这个配置项默认的配置值为1,表示只适用COOKIE方式实现SESSION。  

  

  下面这个配置默认值为0,表示不允许通过传输的方式传递PHPSESSID的值。  

  

  我们可以将session.use_only_cookie设置为0并且将session.use_trans_sid为1实现禁用COOKIE后依然能够使用SESSION。

  

  

  SESSION的垃圾回收机制
  有时候,我们的PHPSESSID这个COOKIE消失以后,SESSION会话数据区依然存在。
  PHP提供一个垃圾回收机制,专门针对清理这类型的无效数据区。
  实现方式
  我们需要在php.ini中进行相应的配置。

  

  PHP将会根据gc_maxlifetime判断会话数据区是否已经失效(如果在这个指定的时间内这个会话数据区依然没有被访问过,那么PHP将认为这个会话数据区可能已经失效),如果失效,那么PHP将会以一个概率值来清除会话数据区,这个概率就是gc_probability除以gc_divisor!

 

  附: php_会话技术— cookie

以上是关于php_会话技术 — session的主要内容,如果未能解决你的问题,请参考以下文章

PHP会话的数据在页面重新加载之间不一致 - 但会话ID是相同的

PHP会话超时脚本[重复]

未设置 PHP 会话 false

PHP - 无法结束会话

PHP 设置普通变量 更改会话变量

PHP会话控制之session_start