0

0

关于session的详细理解

王林

王林

发布时间:2019-08-20 14:23:12

|

4318人浏览过

|

来源于博客园

转载

1、什么是session

session的官方定义是:Session:在计算机中,尤其是在网络应用中,称为“会话控制”。Session 对象存储特定用户会话所需的属性及配置信息。

 说白了session就是一种可以维持服务器端的数据存储技术。session主要有以下的这些特点: 

 1. session保存的位置是在服务器端

 2. session一般来说是要配合cookie使用,如果是浏览器禁用了cookie功能,也就只能够使用URL重写来实现session存储的功能

 3. 单纯的使用session来维持用户状态的话,那么当同时登录的用户数量较多的时候,或者存在较多的数量的session会导致查询慢的问题

 本质上:session技术就是一种基于后端有别于数据库的临时存储数据的技术

2、为什么要有session

主要的一个原因就是HTTP的无状态性

 因为HTTP的无状态性,所以我们没有办法在HTTP发送请求的时候知道当前用户的状态,也就是比如说,当前是哪个用户的之类的这种信息,所以这个时候我们需要session来标识当前的状态

3、session的工作原理

 接下来,通过一个模拟用户登录的流程图来初步理解session的原理,假设这个时候用户执行登录操作,具体的session工作流程如下:

67.jpg

整个流程大概分成这样的几步:

1. 第一步将本地的cookie中的session标识和用户名,密码带到后台中

2. 第二步后台检测有没有对应的session标识,我们以php为例,那么就是检测有没有接收到对应的PHPSESSID

3. 没有的话直接生成一个新的session。有的话,检测对应的文件是否存在并且有效

3. 失效的话,我们需要清除session然后生成新的session。不失效,使用当前的session

看到这里你可能对session的工作原理有一个初步的理解

session的原理图如下:

68.jpg

4、session的常见配置

 我们这里以PHP为例来讲解一下关于session的配置

 首先我们要在PHP的安装目录下面找到php.ini文件,这个文件主要的作用是对PHP进行一些配置,具体以后涉及到再详讲。

  1. 设置session存放在cookie中中标识的字段名,php中默认为PHPSESSID

  对应的设置为:session.name = PHPSESSID

  2. 如果客户端禁用了cookie,可以通过设置session.use_trans_sid来使标识的交互方式从cookie变为url传递

    对应的设置为:session.use_trans_sid = 0

  3. 设置session的保存位置

  对应的设置是session.save_path="D:\phpStudy\PHPTutorial\tmp\tmp"

5、PHP中的session实战

 首先我们需要安装wamp或者是phpstudy,具体方式自行百度

 为了方便观察session文件的变化,我们需要找到session的保存路径(在php.ini中找到session.save_path),如下:

69.jpg

然后找到所指向的目录,注意一般来说session是使用files的形式来保存的,但是我们也可以根据自己的实际情况进行修改。我们可以在php.ini文件中进行修改和查看。

70.jpg

 使用session的第一步,我们要打开session,使用session_start(),然后我们给创建的session添加一个变量,我们假设为demo1,值为default ,代码如下:

执行效果如下:

71.jpg

打开对应的文件,里面的内容如下:

72.jpg

s:7 表示的是类型为string类型,长度为7个长度的字符串

 如果我们对session中的内容进行重新编辑的话,效果如下:

73.jpg

我们观察最近一条的修改日期,我们可以发现就是日期发生了变化,但是文件名没有变化,也就是说,修改session中的内容不会导致文件被新建,而是执行对文件的重新写入操作

 session的销毁

 销毁session一般有两种方式,unsetsession_destroy,我们先来说说第一种

 代码如下:

这一个相当于没有删除session文件,但是使得即使有对应的PHPSESSID也无法获取到相应的session

vue-store高仿小米商城
vue-store高仿小米商城

本项目前后端分离,前端基于Vue+Vue-router+Vuex+Element-ui+Axios,参考小米商城实现。后端基于Node.js(Koa框架)+Mysql实现。前端包含了11个页面:首页、登录、注册、全部商品、商品详情页、关于我们、我的收藏、购物车、订单结算页面、我的订单以及错误处理页面。实现了商品的展示、商品分类查询、关键字搜索商品、商品详细信息展示、登录、注册、用户购物车、订单结算

下载

session_destroy()相对来说比较彻底,直接删除对应的session文件

74.jpg

对于个人来说比较推荐使用第二种方法,因为当要销毁session的时候,那么也就意味着session已经失效了,所以这个时候我们把它给删掉才是最好的处理方式,一方面可以减少对硬盘的存储,另外一方面可以相对优化session的查询速度。

 好了,这个时候我们应该要设置传递给浏览器端的cookie了,默认是自动传送,但是我们应该要学习的是怎样通过后端设置cookie过去

其中有两个方法与session有关的方法我们需要记住,第一个是session_name(),这个是获取cookie的key值得,第二个是session_id,这个是session的文件名

设置的示例代码:

在设置cookie的时候,我们为了程序的安全性,我们应该要禁止JS可以对cookie进行重写,所以需要设置HTTP ONLY,具体的设置方法在Php.ini中找到session.cookie_httponly

然后将其的值设置为1或者true即可

除此之外还可以通过setCookieini_set()来动态设置HTTPONLY属性

在使用session的时候,虽然会从浏览器把PHPSESSID传给后端,但是这个课程不需要人为的去参与。我们只需要保证HTTPONLY被设置就行了。下面是完整的代码:

6、session的相关注意事项

 1. 关闭浏览器session同样存在

 如果我们没有人为的去设置cookie的生命周期的时候默认关闭浏览器session的状态是无法被保存下来的,因为没有设置cookie的生命周期,默认这个时候cookie为session cookie也就是在会话存在的时候cookie才有效,所以关闭浏览器cookie失效,导致后端拿不到对应的PHPSESSID,所以无法找到对应的session文件

2.  session性能瓶颈怎样解决?

如果是后端存在大量的session的时候,那么这个时候就会出现性能的瓶颈,例如:当后端同时存在有5000个session文件的时候,假设要找的文件是在第4999个,那么也就是说前面至少需要遍历4998次,这样就会浪费过多的时间在后端的循环遍历查找文件中,所以这个时候最有效的方法是使用redis或者mongodb,原理是通过将原本保存在本地的session文件写入到内存中,通过内存换空间的形式来达到提升速度

3. 一般不使用URL重写的方法来传递PHPSESSID

其中主要有两个原因,一个是URL重写方式传递的话会导致URL混乱,影响美观。另一个是增大了用户误操作的几率

更多的session的相关配置请点击这里

7、更多的一些PHP.in中的session含义

[Session]

session.save_handler =的存储方式

session.use_cookies= 1 #使用cookies在客户端保存会话

session.use_only_cookies = 1 #去保护URL中传送session id的用户

session.name = PHPSESSID #session名称(默认PHPSESSID)

session.auto_start = 0 #不启用请求自动初始化session

session.cookie_lifetime = 0 #cookie存活时间(0为直至浏览器重启,单位秒)

session.cookie_path = / #cookie的有效路径

session.cookie_domain = #cookie的有效域名

session.cookie_httponly = #httponly标记增加到cookie上(脚本语言无法抓取)

session.serialize_handler = php #PHP标准序列化

session.gc_probability =1

session.gc_divisor =1000 #建议设置1000-5000

#概率=session.gc_probability/session.gc_divisor(1/1000)

#页面访问越频繁概率越小

session.gc_maxlifetime =1440 #过期时间(默认24分钟,单位秒)

session.bug_compat_42 = off #全局初始化session变量

session.bug_compat_warn = off

session.referer_check = #防止带有ID的外部URL

session.entopy_length = 0 #读取的字节

session.cache_limiter = {nocache,private,pblic} #HTTP缓冲类型

session.cache_expire = 180 #文档过期时间(分钟)

session.use_trans_sid = 1 #trans_sid支持(默认0)

session.hash_function = 0 #hash方法{0:md5(128 bits),1:SHA-1(160 bits)}

session.hash_bits_per_character = 5 #当转换二进制hash数据奥可读形式是,每个字符保留位数

session.save_path = "/var/lib/php/session" #session id存放路径

以上是对session的详细讲解,更多相关问题请访问PHP中文网:https://www.php.cn/

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

483

2023.08.02

cookie
cookie

Cookie 是一种在用户计算机上存储小型文本文件的技术,用于在用户与网站进行交互时收集和存储有关用户的信息。当用户访问一个网站时,网站会将一个包含特定信息的 Cookie 文件发送到用户的浏览器,浏览器会将该 Cookie 存储在用户的计算机上。之后,当用户再次访问该网站时,浏览器会向服务器发送 Cookie,服务器可以根据 Cookie 中的信息来识别用户、跟踪用户行为等。

6429

2023.06.30

document.cookie获取不到怎么解决
document.cookie获取不到怎么解决

document.cookie获取不到的解决办法:1、浏览器的隐私设置;2、Same-origin policy;3、HTTPOnly Cookie;4、JavaScript代码错误;5、Cookie不存在或过期等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

348

2023.11.23

阻止所有cookie什么意思
阻止所有cookie什么意思

阻止所有cookie意味着在浏览器中禁止接受和存储网站发送的cookie。阻止所有cookie可能会影响许多网站的使用体验,因为许多网站使用cookie来提供个性化服务、存储用户信息或跟踪用户行为。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

414

2024.02.23

cookie与session的区别
cookie与session的区别

本专题整合了cookie与session的区别和使用方法等相关内容,阅读专题下面的文章了解更详细的内容。

93

2025.08.19

session失效的原因
session失效的原因

session失效的原因有会话超时、会话数量限制、会话完整性检查、服务器重启、浏览器或设备问题等等。详细介绍:1、会话超时:服务器为Session设置了一个默认的超时时间,当用户在一段时间内没有与服务器交互时,Session将自动失效;2、会话数量限制:服务器为每个用户的Session数量设置了一个限制,当用户创建的Session数量超过这个限制时,最新的会覆盖最早的等等。

316

2023.10.17

session失效解决方法
session失效解决方法

session失效通常是由于 session 的生存时间过期或者服务器关闭导致的。其解决办法:1、延长session的生存时间;2、使用持久化存储;3、使用cookie;4、异步更新session;5、使用会话管理中间件。

752

2023.10.18

cookie与session的区别
cookie与session的区别

本专题整合了cookie与session的区别和使用方法等相关内容,阅读专题下面的文章了解更详细的内容。

93

2025.08.19

C++ 设计模式与软件架构
C++ 设计模式与软件架构

本专题深入讲解 C++ 中的常见设计模式与架构优化,包括单例模式、工厂模式、观察者模式、策略模式、命令模式等,结合实际案例展示如何在 C++ 项目中应用这些模式提升代码可维护性与扩展性。通过案例分析,帮助开发者掌握 如何运用设计模式构建高质量的软件架构,提升系统的灵活性与可扩展性。

14

2026.01.30

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Laravel 5.8 中文文档手册
Laravel 5.8 中文文档手册

共74课时 | 88.5万人学习

SESSION实现登录与验证
SESSION实现登录与验证

共10课时 | 9.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号