原创

深入了解session的执行步骤

温馨提示:
本文最后更新于 2019年02月03日,已超过 1,907 天没有更新。若文章内的图片失效(无法正常加载),请留言反馈或直接联系我

关于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文件

正文到此结束
本文目录