深入了解session的执行步骤

简介: 深入了解session的执行步骤

关于php session的实现方法,在之前我其实已经发过很多个相关的文章了

php session基本原理解析

windows php关于session临时文件的一个坑

session会话

这篇文章,将使用strace工具去追踪php的session到底是如何执行的

安装strace工具很简单,只需要:

apt-get install strace

首先,我们准备一个非常纯洁的test.php文件:

<?php

先测试下strace命令:

strace php test.php


image.png

由于php启动过程非常多,我只截图了开始运行以及结束的系统调用执行过程

session start

现在,我们开始写session的测试代码:

<?php
session_start();//session开始i
$_SESSION\['name'\]='仙士可';
$_SESSION\['age'\]=21;
echo 1;//echo个1查看顺序
$_SESSION\['qq'\]=1067197739;
//赋值多个,查看存储的步骤

由于使用的是php-cli模式,不好测试header头以及二次访问

可看出,session start有以下几个步骤:

1:随机生成一个session id

2:尝试获取session文件,如果不存在则新增

3:发送一个header头(截图没有体现)

4:文件加锁,准备写入数据

在文件执行完毕之后,将$_SESSION的值序列化后存储到文件中

这样,session的周期已经完毕

存在session文件

第一次访问php,则会随机生成一个session文件发送header头,等待浏览器第二次请求携带cookie,进行判断session_id,我们可以通过上面已经生成的session_id,然后通过session_id函数赋值,进行模拟浏览器携带cookie的情况:

<?php
session_id('g3ddi98a484aer6l4sbqmllpl6');
session_start();//session开始
var\_dump($\_SESSION);

image.png

可看出,第二次访问之后,php会读取原有的session文件,赋值到$_SESSION全局变量中,然后更新session文件的使用时间,以免被gc

删除session

通过session_destroy()去销毁session

<?php
session_id('g3ddi98a484aer6l4sbqmllpl6');
session_start();//session开始
session_destroy();// 销毁session

image.png

session gc

在php中,原生的session非常恶心,恶心的点在于它的gc机制

php session的gc是通过几率触发,然后遍历session文件,通过获取所有session文件的最后修改时间进行比对,再删除文件,这会造成以下几种情况:

1:几率gc,意味着session过期不会马上删除文件

2:遍历gc,意味着每次gc都要消耗大量的性能

本人通过运行n次文件,去模拟多个session

for((i=1;i<=100;i++));  
do   
php test.php
done

image.png

调用session gc

session\_gc();//session\_gc;

image.png

可看到在不断的遍历session文件

目录
相关文章
解决开启子线程,导致request上下文和session信息丢失问题
解决开启子线程,导致request上下文和session信息丢失问题
1105 0
|
3月前
|
存储 缓存 NoSQL
Gin 应用多实例部署session问题、session参数与刷新
【8月更文挑战第7天】在Gin应用多实例部署中,传统基于内存的Session存储会导致数据不一致或丢失。需采用如数据库或Redis存储、及Session同步机制确保一致性。示例代码展示了使用Redis存储Session的过程。合理选择方案对保证系统稳定和用户体验至关重要。
|
运维 监控 关系型数据库
DO447管理任务执行--速度执行优化
DO447管理任务执行--速度执行优化
201 0
DO447管理任务执行--速度执行优化
|
SQL 存储 Java
Flowable 已经执行完毕的流程去哪找?
Flowable 已经执行完毕的流程去哪找?
Flowable 已经执行完毕的流程去哪找?
|
XML NoSQL Java
SpringSession的源码解析(生成session,保存session,写入cookie全流程分析)
上一篇文章主要介绍了如何使用SpringSession,其实SpringSession的使用并不是很难,无非就是引入依赖,加下配置。但是,这仅仅只是知其然,要知其所以然,我们还是需要深入源码去理解。
644 0
SpringSession的源码解析(生成session,保存session,写入cookie全流程分析)
on方法多次绑定会多次执行的解决方法
on方法多次绑定会多次执行的解决方法
130 0
|
SQL Oracle 网络协议
一条UPDATE从生到死的整个过程的深入解析
这是曾经Oracle原厂的一位兄弟问我的一个问题,后来也有些人问起这个问题: 用ORACLE内部原理描述以下过程: 1、sqlplus gyj/gyj@orcl 2、updatet_gyj set name='gyj1' where id=1; 3、commit; 4、exit 一看这个问题是不是灰常复杂,阿里系的童鞋特别喜欢用类似这样的题目面试人,从中可以快速的判断你是哪个级别的DBA(初级/中级/高级),在这个问题上我给大家抛砖迎玉,由于能力有限只能做简单解释,欢迎大家一起参与讨论并补充。嘿嘿!这是个很理论的东东希望对大家在处理实际问题的时候有一点点帮助。
一条UPDATE从生到死的整个过程的深入解析