浏览器通过web访问服务器,服务器的web服务开启后,第一步就是开启session,这也是session的第一阶段:

session_start()

  这个函数的作用:开启session,然后根据以前设置的session_name去读取cookie信息,判断$_Cookies[$session_name]判断是否有值,也就是是否存在session_id,如果存在就用这个session_id,如果没有就会随机生成一个唯一的32位的数值,将这个数值赋值给session_id。这个session_id就代表当前访问的用户。然后初始化$SESSION这个变量,根据session_id读取session文件中的内容(如果有session_id所对应的保存文件的话),把内容反序列化之后赋值到$SESSION这个变量中,这个阶段还有一个特别关键的作用,还会判断那些session文件已经过期,调用gc进程,删除掉过期的session文件。gc如何判断文件是否过期,如何操作后面再说

session_start(); echo "SID: ".SID.""; echo "session_id(): ".session_id().""; echo "COOKIE: ".$_COOKIE["PHPSESSID"];
输出:
SID:PHPSESSID=bjjwfoo45hajsjv89trsgtiertbuiwom
session_id():bjjwfoo45hajsjv89trsgtiertbuiwom
cookie:提示Notice:undefined index:PHPSESSID
这个因为浏览器第一次请求还没有在cookie中存储session_id,这个cookie的一个特性,只有当第一次请求之后,服务器接收到请求才在服务器端设置cookie,存储session_id。
注意:cookie中存储的session_id默认是会话时间 SID:是系统常量,SID包含着会话名以及会话ID的常量,格式为“name=ID”,如果cookie中已经存在session_id,SID就为一个空字符串,不然就是"name=ID"

第二阶段就是脚本运行期间:
php只是对$_SESSION这个变量进行增删改查的操作,需要注意:这个阶段并没有影响到session文件里面的内容,除非你在这个阶段session_destroy()了,除此之外,该阶段不会对session文件有任何影响

第三阶段:脚本执行结束
在这个阶段才会对session文件进行操作,也就是这个阶段才会把$_SESSION数组中的数据序列化然后存储到session文件。

session的存储方式

默认会存储在服务器的临时目录,以文件的形式存储,文件名为(sess_+session_id),这些都可以在php.ini文件中配置,文件内容为序列化的数据,如下:

$_SESSION['name'] = ‘张三'
$_SESSION['age'] = 18
session文件为:
name|i:张三;age|i:18

下面是常用的php.ini文件中sessionde相关配置:

session.save_handler = files    #规定session的存储方式,默认是文件,还可以是redis或者是memcache,提升效率
session.save_path = "d:/wamp/tmp" #规定session文件的存储目录
session.use_cookies = 1 #是否使用cookie存储session_id
session.name = PHPSESSID #客户端存储session_id的会话名
session.auto_start = 0 #是否自动开启session
session.cookie_lifetime = 0 #设置客户端中存储的session_id的过期时间,注意session的过期时间是间隔的,比如20分钟过期,重新访问了,session的过期时间会重新计算,cookie的过期时间是累记的
session.serialize_handler = php
session.gc_divisor = 1000
session.gc_probability = 1
session.gc_maxlifetime = 1440 #设置session文件的过期时间

session的垃圾回收机制

一个用户访问服务器会产生一个session文件,关闭浏览器,然后在访问服务器又会产生一个新的session文件,这样session的垃圾文件就会很多,长时间不清理就会占用大量的磁盘空间,访问session文件的速度也会降低,gc进程垃圾回收就很有必要了
先提一下PHP的一些清理session的函数

unset($_SESSION['name'])    清理某个变量
session_unset() 不传参数,清除所有的session变量,但是session文件还在
session_destroy() 清除session文件
setcookie(session_name(), '', time()-1000, '/') 设置cookie文件过期

注意:一般做了session_destroy()操作之后,setcookie(session_name(), '', time()-1000, '/')也是必须的,不然用户重新刷新页面,又会设置一样的session_id,产生session文件

然后就是gc自动删除垃圾文件:

session.gc_divisor = 1000
session.gc_probability = 1
session.gc_maxlifetime = 1440 #设置session文件的过期时间

删除session垃圾文件的概率是,session.gc_probability/session.gc_divisor=1/1000,也就是说每次session_start()都会有1/1000的概率触发gc进程,但是1000次中必会有一次,如果session.gc_probalility = 1000,就是100%的概率,也就说每次session_start()都会触发gc进程
 
 

Session的运行机制的更多相关文章

  1. php中session的运行机制

    在PHP中session默认是以文件的形式存储于服务器的 而客户端和服务端则是通过session_id来完成握手的,默认情况下PHP会将session_id存储于cookie中,用户每次请求时该ses ...

  2. SSL/TLS协议运行机制的概述

    互联网的通信安全,建立在SSL/TLS协议之上. 本文简要介绍SSL/TLS协议的运行机制.文章的重点是设计思想和运行过程,不涉及具体的实现细节.如果想了解这方面的内容,请参阅RFC文档. 一.作用 ...

  3. SSL/TLS协议运行机制

      转载自http://www.ruanyifeng.com/blog/2014/02/ssl_tls.html 互联网的通信安全,建立在SSL/TLS协议之上. 本文简要介绍SSL/TLS协议的运行 ...

  4. JSP基础总结(运行机制、脚本元素、指令元素、动作元素)

    JSP的运行机制: 1.转译阶段:JSP页面转换成Servlet类: 2.请求阶段:Servlet类执行,将相应结果发送至客户端. 流程解释: 1.用户访问某个JSP页面 2.服务器找到相应的JSP页 ...

  5. 【转】SSL/TLS协议运行机制的概述

    互联网的通信安全,建立在SSL/TLS协议之上. 本文简要介绍SSL/TLS协议的运行机制.文章的重点是设计思想和运行过程,不涉及具体的实现细节.如果想了解这方面的内容,请参阅RFC文档. 一.作用 ...

  6. SSL协议运行机制

    SSL/TLS协议运行机制 一.作用 不使用SSL/TLS的HTTP通信,就是不加密的通信.所有信息明文传播,带来了三大风险. (1) 窃听风险(eavesdropping):第三方可以获知通信内容. ...

  7. ASP.NET的运行原理与运行机制 如何:为 IIS 7.0 配置 <system.webServer> 节

    https://technet.microsoft.com/zh-cn/sysinternals/bb763179.aspx 当一个HTTP请求到服务器并被IIS接收到之后,IIS首先通过客户端请求的 ...

  8. ASP.NET 运行机制

    原本今天打算继续写ASP.NET MVC第四天的.但是由于里面涉及到asp.net运行机制的原理,如果不分析一下这里,mvc想说清楚还是挺困难的.既然要提到asp.net运行机制,所以打算还是说详细一 ...

  9. 小学生之浅谈Struts2与struts1的运行机制

    Struts1工作原理图: 1.初始化:struts框架的总控制器ActionServlet是一个Servlet,它在web.xml中配置成自动启动的Servlet,在启动时总控制器会读取配置文件(s ...

  10. <转>ASP.NET学习笔记之理解MVC底层运行机制

    ASP.NET MVC架构与实战系列之一:理解MVC底层运行机制 今天,我将开启一个崭新的话题:ASP.NET MVC框架的探讨.首先,我们回顾一下ASP.NET Web Form技术与ASP.NET ...

随机推荐

  1. dig 命令详解及使用示例

    一.背景知识 CNAME CNAME 是 Canonical Name 的缩写,它是 DNS(域名系统)记录的一种类型.CNAME 记录用于将一个域名映射(别名)到另一个域名.换句话说,当你访问一个设 ...

  2. python rsa加密

    rsa简单加密: 1 import rsa 2 import base64 3 4 rsa_key_pair = rsa.newkeys(2048) # 生成密钥对,返回(PublicKey(n,e) ...

  3. Java开发工具和历史版本

    eclipse 的历史版本: 版本代号 平台版本 主要版本发行日期 SR1发行日期 SR2发行日期 SR3发行日期 代号名称 N/A 3.0 2004年6月21日 [2]  N/A N/A N/A N ...

  4. 火山引擎数智平台赋能火花思维,A/B测试加速创新

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群.   在数字化浪潮下,火花思维凭借其对数据驱动的理解与实践,搭上了业务快速增长的快车.这一效果的背后,离不开火花思 ...

  5. 解决方案 | cad选择集找出包含特定字符串的多行文本

    代码如下: 1 # 选择文本中出现特定单词的多行文字 2 # 下面的代码将选择条件定义为文本字符串中出现"The"的任意选项.此示例还演示了选择方法的用法:MtextSelectB ...

  6. MoneyPrinterPlus全面支持本地Ollama大模型

    MoneyPrinterPlus现在支持批量混剪,一键AI生成视频,一键批量发布短视频这些功能了. 之前支持的大模型是常用的云厂商,比如OpenAI,Azure,Kimi,Qianfan,Baichu ...

  7. [rCore学习笔记 015]特权级机制

    写在前面 本随笔是非常菜的菜鸡写的.如有问题请及时提出. 可以联系:1160712160@qq.com GitHhub:https://github.com/WindDevil (目前啥也没有 官方文 ...

  8. 前端说你的API接口太慢了,怎么办?

    当有千万条海量数据时,前端调取接口发现接口响应的太慢,前端这时让你优化一下接口,你说有几千万条数据,觉得自己尽力了,前端觉得你好菜,别急,读完这篇文章,让前端喊你一声:大佬,厉害!!! 常用的方法总结 ...

  9. 项目中的坑记录~v-if和v-show的坑

    有个功能是这样的,点击获取验证码,获取验证码之后将输入框禁用,进行倒计时11秒. 问题:第一次的倒计时是从6开始的, 之后的倒计时都是从9开始倒计,没有从11开始 解决:主要是用了v-show.倒计时 ...

  10. 推荐几款.NET开源且功能强大的实用工具,助你提高工作开发效率!

    前言 俗话说得好"工欲善其事,必先利其器",今天大姚给大家推荐8款.NET开源且功能强大的实用工具,助你提高工作开发效率! DevToys 一款基于C#开源(MIT License ...