Session是什么?

首先,我们大概知道session是浏览器与服务器之间的一次交互会话。

那么会话又是什么呢?顾名思义就是浏览器与服务器之间的对话,浏览器一关闭,会话就结束了。

说session不得不说的就是HTTP协议和cookie了

我们都知道http协议是一个无状态的协议,就是说本次请求和上次请求没有任何关系。这就会带了一个问题,如果请求的页面有关联,比如登录后访问首页,那么在首页怎么判断是登录状态呢?

所以此时cookie就出现了,cookie是把少量的信息存储在用户自己的浏览器上,当用户用浏览器访问服务器时,PHP就可以读取cookie中的信息,在任何页面中都可以使用。

但是cookie存在缺陷,cookie存储在客户端,存储大小有限制,一个域名下存储个数也有限制,最关键的是用户是可见的,不安全,用户可以修改甚至禁用cookie

这个时候session就出现了,session存储在服务器端,不用每次请求客户端都随身携带cookie

所以:session的作用就是:解决HTTP协议请求的无状态问题,让多次的HTTP请求产生联系

Session的运行机制

我们要使用session,第一步就是开启session,这也是session的第一阶段:

session_start() 阶段

这个函数的作用就是开启session,开启之后读取cookie信息判断是否存在session_id,如果存在就是用这个session_id,如果没有就会随机生成一个唯一的32位的session_id。通过这个session_id就可以绑定一个唯一的用户。

这个过程还会初始化$SESSION这个变量,读取session文件中的内容,把内容反序列化之后赋值到$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进程

原文:https://www.cnblogs.com/daijiandong/p/12070947.html

php中的session详解,PHP中的session机制详解相关推荐

  1. Redis持久化——AOF机制详解

    在运行情况下,Redis 以数据结构的形式将数据维持在内存中,为了让这些数据在 Redis 重启之后仍然可用,需要将数据写入持久存储 持久化是指将数据写入持久存储,例如固态磁盘(SSD) Redis ...

  2. Binder机制详解(一)

    系列目录 Binder机制详解(二) Binder机制详解(三) 文章目录 前言 一.爱情例子 1.普通Linux间进程通信方式 2.接着讲爱情的例子(Binder的实现机制) 3.Binder少拷贝 ...

  3. Session机制详解及分布式中Session共享解决方案

    Session机制详解及分布式中Session共享解决方案 参考文章: (1)Session机制详解及分布式中Session共享解决方案 (2)https://www.cnblogs.com/jing ...

  4. asp.net Session在web.config中的三种配置方式——详解

    这段代码就是设置session在web.config中的存储方式. < sessionState mode="Off|InProc|StateServer|SQLServer" ...

  5. PHP开启session的函数,ThinkPHP中session函数详解

    在PHP中使用$_SESSION来操作session,而ThinkPHP提供了session的封装函数session().单单这一个函数就实现了session的增删改查的功能.下面我们分别来看其应用与 ...

  6. java分布式会话redis_详解springboot中redis的使用和分布式session共享问题

    对于分布式使用Nginx+Tomcat实现负载均衡,最常用的均衡算法有IP_Hash.轮训.根据权重.随机等.不管对于哪一种负载均衡算法,由于Nginx对不同的请求分发到某一个Tomcat,Tomca ...

  7. 【微服务之分布式Session】Session机制详解及分布式中Session共享解决方案

    一.为什么要产生Session http协议本身是无状态的,客户端只需要向服务器请求下载内容,客户端和服务器都不记录彼此的历史信息,每一次请求都是独立的. 为什么是无状态的呢?因为浏览器与服务器是使用 ...

  8. java 拦截指定jsp_详解Struts2中对未登录jsp页面实现拦截功能

    struts2中拦截器大家都很经常使用,但是拦截器只能拦截action不能拦截jsp页面.这个时候就有点尴尬了,按道理来说没登录的用户只能看login界面不能够通过输入url进行界面跳转,这显然是不合 ...

  9. okhttp post php,Android_详解Android中使用OkHttp发送HTTP的post请求的方法,HTTP POST 和 PUT 请求可以包含要 - phpStudy...

    详解Android中使用OkHttp发送HTTP的post请求的方法 HTTP POST 和 PUT 请求可以包含要提交的内容.只需要在创建 Request 对象时,通过 post 和 put 方法来 ...

最新文章

  1. 算法提高课-搜索-最短路模型-AcWing 1100. 抓住那头牛:bfs
  2. 真实而震撼:同班同学20年后,身价15亿与月薪5000元的区别
  3. mysql8 修改密码_sysbench压测软件连接mysql8失败案例分析
  4. IIS7.0 部署wcf 404或者配置MIME(转)
  5. win7 php 上传文件,在LNMP原来的基础上,win7环境下如何上传PHP文件到Linux环境下...
  6. rehl7安装mysql5.7_Linux RPM包安装总结
  7. 敏捷开发中asp.net MVC的开发次序感受(先开发View?先开发Model?先开发Controller!)...
  8. scala中的filter函数
  9. 2007年7月23日旅游
  10. Ruby在Windows下安装
  11. 推送之信鸽推送详解 Think Different
  12. 教师评语计算机实验报告作业,作业实验报告评语大全
  13. python安装time模块_Python之路-Python常用模块-time模块
  14. python-银行转账系统的简单实现及test
  15. hdu 6437 Videos 最小费用最大流
  16. EMQX的Web管理后台-Dashboard
  17. 老子,他有什么了不起
  18. 智慧公厕系统让如厕成为一种享受
  19. slam优化库,优化方法,G2o Ceres的学习
  20. Unity多选题功能开发

热门文章

  1. 你最拿手的5种程序设计语言是什么
  2. range()的用法
  3. 荔枝架构演进历程读后感
  4. android仿照360壁纸照片显示特效,Android仿360桌面手机卫士悬浮窗效果
  5. 开源4年,极客猿导航迎来了V3.0
  6. java jcombobox用法_java – 填充JComboBox的正确方法?
  7. Linux设备驱动之Kobject、Kset(转载)
  8. Google重磅发布云游戏平台,彻底告别游戏主机时代
  9. 户外跑步必备装备有哪些,五款户外运动蓝牙耳机推荐
  10. 玩转海陆空,开启全家出游香港新方式