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