1、php中session的生成机制

我们先来分析一下PHP中是怎么生成一个session的。设计出session的目的是保持每一个用户的各种状态来弥补HTTP协议的不足(无状态)。我们现在有一个疑问,我们都知道session是保存在服务器的,既然它用于保持每一个用户的状态那它利用什么来区别用户的呢?这个时候就得借助cookie了。当我们在代码中调用session_start();时,PHP会同时往SESSION的存放目录(默认为/tmp/)和客户端的cookie目录各生成一个文件。session文件名称像这样:

格式为sess_{SESSIONID} ,这时session文件中没有任何内容,当我们在session_start();添加了这两行代码:

$_SESSION['name'] = 'wanchun0222';

$_SESSION['blog'] = 'coderbolg.net';

这时文件就有内容了:

name|s:11:"wanchun0222";blog|s:13:"coderbolg.net";

这时再看看cookie:

可以看到服务器为我们自动生成了一个cookie,cookie名称为"PHPSESSID",cookie内容是一串字符,其实这串字符就是{SESSIONID}。也许你已经明白了,当我们使用session时,PHP就先生成一个唯一的SESSIONID号(如2bd170b3f86523f1b1b60b55ffde0f66),再在我们服务器的默认目录下生成一个文件,文件名为sess_{SESSIONID},同时在当前用户的客户端生成一个cookie,内容已经说过了。这样PHP会为每一个用户生成一个SESSIONID,也就是说一个用户一个session文件。PHP第一次为某个用户使用session时就向客户端写入了cookie,当这个用户以后访问时,浏览器会带上这个cookie,PHP在拿到cookie后就读出里面的SESSIONID,拿着这个SESSIONID去session目录下找session文件。找到后在调用$_SESSION['blog']的时候显示出来。

2、php中session的过期回收机制

我们明白了session的生成及工作原理,发现在session目录下会有许多session文件。当然这些文件一定不是永远存在的,PHP一定提供了一种过期回收机制。在php.ini中session.gc_maxlifetime为session设置了生存时间(默认为1440s)。如果session文件的最后更新时间到现在超过了生存时间,这个session文件就被认为是过期的了。在下一次session回收的时候就会被删除。那下一次session回收是在什么时候呢?这和php请求次数有关的。在PHP内部机制中,当php被请求了N次后就会有一次触发回收机制。到底是请求多少次触发一次是通过以下两个参数控制的:

session.gc_probability = 1

session.gc_divisor = 100

这是php.ini的默认设置,意思是每100次PHP请求就有一次回收发生。概率是 gc_probability/gc_divisor 。我们了解了服务器端的session过期机制,再来看看客户端的cookie的过期机制。

如果cookie失效了浏览器自然发送不了cookie到服务器,这时即使服务器的session文件存在也没用,因为PHP不知道要读取哪个session文件。我们知道PHP的cookie过期时间是在创建时设置的,那么PHP在创建session的同时为客户端创建的cookie的生命周期是多久呢?这个在php.ini中有设置:session.cookie_lifetime 。这个值默认是0,代表浏览器一关闭SESSIONID就失效。那就是说我们把session.gc_maxlifetime和session.cookie_lifetime设置成同一个值就可以控制session的失效时间了。

3、php中session的客户端存储机制

由上面的介绍我们可以知道,如果用户关闭了cookie,那我们的session就完全没法工作了。是的,确实是这样。php中session的客户端存储机制只有cookie吗?不是的。既然我们的SESSIONID 不能通过cookie传递到各个页面,那我们还有另一个法宝,就是通过页面GET传值的方式。

PHP可以在cookie被禁用时自动通过GET方式跨页传递SESSIONID,前提是设置php.ini的session.use_trans_sid为1。这时当我们在客户端禁用了cookie时使用了session,并在当前页面通过点击链接到另一页面时,PHP会自动在链接上添加SESSIONID参数,像这样:nextpage.php?SESSIONID=2bd170b3f86523f1b1b60b55ffde0f66。我想你应该看到了这种方式的缺点:好像不够安全啊。

php session_id 生成规则,php中Session的生成机制、回收机制和存储机制探究相关推荐

  1. php中Session的生成机制、回收机制和存储机制探究

    转载:http://www.jb51.net/article/53938.htm 这篇文章主要介绍了php中Session的生成机制.回收机制和存储机制探究,可以帮助大家对Session有一个全面的了 ...

  2. ai怎么生成条形码_中琅条码生成软件如何制作SCC-14条码

    SCC-14不是一种标准的条码类型,没有正式的条码码制,SCC-14的全称是Shipping Container Code,即集装箱运输代码,其编码长度为14位.SCC-14本身就是ITF-14条码或 ...

  3. PHP中session特点及用途,PHP特点之会话机制2——Session及其使用

    会话机制(Session)在 PHP 中用于保存并发访问中的一些数据.这使可以帮助创建更为人性化的程序,增加站点的吸引力. 一个访问者访问你的 web 网站将被分配一个唯一的 id, 就是所谓的会话 ...

  4. 【JetPack】数据绑定 DataBinding 简介 ( 使用要求 | Gradle 版本 | 定义数据类 | 定义数据绑定布局 | Activity 数据绑定 | 绑定类生成规则 )

    文章目录 I . 数据绑定 简介 II . 数据绑定 使用前提 ( 环境支持 ) III . 数据绑定 使用流程 一 : 启用数据绑定 IV . 数据绑定 使用流程 二 : 定义数据类 V . 数据绑 ...

  5. 【JetPack】ViewBinding 视图绑定组件 ( 启用模块 | 视图绑定定制 | 绑定类名称生成规则 | 绑定类字段生成规则 | 绑定类获取根视图 | 绑定类获取布局组件 )

    文章目录 I . 视图绑定组件简介 II . 视图绑定 ViewBinding 使用前提 ( Android Studio 3.6 ) III . 视图绑定组件启用 IV . 定制视图绑定 ( 启用视 ...

  6. 订单号的生成规则和不同生成策略-总结

    订单号的不同生成策略-总结 一. 订单命名的几种规则 不重复:订单号的唯一行 安全性:订单编号中不要透露任何和公司有关的信息,不要使用流水号,容易暴露公司的运营情况 不要使用大规模随机码:随机编码可以 ...

  7. php启动 大量sess文件,关于PHP中Session文件过多的有关问题

    关于PHP中Session文件过多的问题 PHP的默认机制:每一次php请求,会有1/100的概率(默认值)触发"session回收".如果"session回收" ...

  8. PHP中session的工作原理

    一直在使用session存储数据,一直没有好好总结一下session的使用方式以及其工作原理 今天在这里做一下梳理 这里的介绍主要是基于php语言,其他的语言操作可能会有差别,但基本的原理不变. 1. ...

  9. jsp中session 和 cookies区别

    为什么登陆后,只要不关闭浏览器,session就能一直存在?当然session的数据是保存在服务器上的,但服务器是怎么识别这些数据都是谁的呢?答案是sessionid,每一个浏览者都唯一的sessio ...

最新文章

  1. 苹果手机换了屏显示无服务器,苹果将​​为存在显示问题的iPhone 11提供免费更换...
  2. Observer模式在J2EE中的实现
  3. C#2.0中的泛型学
  4. 圆你国产数据库DBA之梦,达梦DCA培训考试券免费拿
  5. Apache ab 测试结果的分析
  6. express服务器多次访问数据库实例
  7. markdown模板(个人使用)
  8. matlab力学大作业答案,计算力学大作业报告.docx
  9. 月度计划之2012年10月中旬—11.15
  10. blowfish加密算法(c实现)
  11. 转:著名的100个管理定律点评1 -- 管人用人育人留人之道
  12. 2021-10-11
  13. [MSDN]关键字查询语言 (KQL) 语法参考
  14. 1000瓶水和1瓶毒水还有10只老鼠
  15. 软件架构设计|C4模型
  16. 编程语言只是一个工具
  17. PowerApps教程09-下拉列表以及联动筛选
  18. linux系统与Windows7系统之间文件的兼容性问题
  19. linux命令-查看日志
  20. 问题解决 | 黑金AX7020使用Petalinux定制Linux系统遇到的坑

热门文章

  1. (附源码)spring boot毕业论文管理系统 毕业设计 030946
  2. 【DNA计算】DNA编码----笔记1
  3. ThingsBoard 使用
  4. ArcGIS三维网络分析
  5. CLI, CILCLR
  6. Python学习:print函数的用法
  7. uni-app 中微信小程序使用高德地图等第三方 SDK的方法
  8. Android开发人员不得不收集的代码,面试心得体会
  9. Android-系统服务-MediaRecorder
  10. astercc开源电话计费系统