深入了解session的执行步骤

举报
仙士可 发表于 2023/06/21 16:35:59 2023/06/21
【摘要】 关于php session的实现方法,在之前我其实已经发过很多个相关的文章了php session基本原理解析windows php关于session临时文件的一个坑session会话这篇文章,将使用strace工具去追踪php的session到底是如何执行的安装strace工具很简单,只需要:apt-get install strace复制首先,我们准备一个非常纯洁的test.php文件:...

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

php session基本原理解析

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

session会话

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

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

apt-get install strace
复制

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

<?php
复制

先测试下strace命令:

strace php test.php
复制

由于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);
复制

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

删除session

通过session_destroy()去销毁session

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

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
复制

调用session gc

session_gc();//session_gc;
复制

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

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。