深度解析 Session 机制

本文介绍PHP中的Session存储配置方法,包括通过php.ini文件配置Session存储路径、生命周期管理和垃圾回收机制。探讨了使用文件系统和Memcache作为存储媒介的优缺点,并提供了一个简单的Memcache示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

0?wx_fmt=png

Session 存储方式


在 php.ini 文件中,进行配置。

session.save_handler = files

session.save_path = "N;MODE;/tmp"

这两个参数可以在 PHP 中通过 ini_set 来设置,不用直接覆盖原 php.ini 中的值。


注释:

N 表示多级目录,值为数字。

MODE 表示创建的 Session 文件权限。

/tmp 表示 Session 存储路径。


PHP官网的解释:


此指令还有一个可选的 N 参数来决定会话文件分布的目录深度。

例如,设定为 '5;/tmp' 将使创建的会话文件和路径类似于 /tmp/4/b/1/e/3/sess_4b1e384ad74619bd212e236e52a5a174If。

要使用 N 参数,必须在使用前先创建好这些目录。

在 ext/session 目录下有个小的 shell 脚本名叫 mod_files.sh,windows 版本是 mod_files.bat 可以用来做这件事。

此外注意如果使用了 N 参数并且大于 0,那么将不会执行自动垃圾回收,更多信息见 php.ini。

另外如果用了 N 参数,要确保将 session.save_path 的值用双引号 "quotes" 括起来,因为分隔符分号( ;)在 php.ini 中也是注释符号。

文件储存模块默认使用 mode 600 创建文件。

通过 修改可选参数 MODE 来改变这种默认行为: N;MODE;/path ,其中 MODE 是 mode 的八进制表示。 

MODE 设置不影响进程的掩码(umask)。

Caution:使用以上描述的可选目录层级参数 N 时请注意,对于绝大多数站点,

大于1或者2的值会不太合适——因为这需要创建大量的目录:例如,值设置为 3 需要在文件系统上创建 64^3 个目录,将浪费很多空间和 inode。

仅仅在绝对肯定站点足够大时,才可以设置 N 大于2。


Session 生命周期


1. 第一种是通过程序


session_destory()方法清除所有session

unset(session['x'])来清除指定的session['x']。


2. 第二种是通过编辑浏览器


关闭后会直接清除所有session。


Session 垃圾回收机制


session.gc_maxlifetime

session.gc_probability

session.gc_divisor


Garbage Collection 垃圾回收:


session.gc_divisor 与 session.gc_probability 合起来定义了在每个会话初始化时启动 GC 进程的概率。


此概率用 gc_probability/gc_divisor 计算得来。例如 1/1000 意味着在每个请求中有 0.1% 的概率启动 GC 进程。


GC的工作,就是扫描所有的session信息, 用当前时间减去session的最后修改时间(modified date),同session.gc_maxlifetime参数进行比较,


如果生存时间已经超过gc_maxlifetime,就把该session删除。


Session 共享


1. Redis [分布式]

2. Memcache [分布式]


以Memcache 为例:

多台机器共用一个 memcache 这样的好处,就是在并发大访问的情况下,还能防止单台机器,因为反复创建和打开SESSION文件,造成的IO压力,之前测试过,对于缓实IO压力很有效。


//配置 php.ini,配置后记得重启

//memcache Ip(127.0.0.1) Port(11211) 

session.save_handler = memcache

session.save_path = "tcp://127.0.0.1:11211"

//set_session.php

session_start();

$_SESSION['name'] = 'Bihu';

print $_SESSION['name'];

print "<br>";

print session_id();


//运行后输出 

//Bihu

//9325ag3rvunvhl7c2pfd3u27n0

//表示:Session 存储成功

//get_session.php

$memcache = new Memcache();

$memcache->connect('127.0.0.1', 11211);

$data = $memcache->get('9325ag3rvunvhl7c2pfd3u27n0');

print $data;


//运行后输出

//name|s:4:"Bihu"; (解析数据即可[首先要先了解Session数据结构])

//表示:Session 获取成功

//附上解析数据方法

function unserialize_php($session_data) 

{    

    $return_data = array();    

    $offset = 0;    

    while ($offset < strlen($session_data)) {        

        if (!strstr(substr($session_data, $offset), "|")) {            

            throw new Exception("invalid data, remaining: " .substr($session_data, $offset));        

        }        

        $pos = strpos($session_data, "|", $offset);        

        $num = $pos - $offset;        

        $varname = substr($session_data, $offset, $num);

        $offset += $num + 1;        

        $data = unserialize(substr($session_data, $offset));

        $return_data[$varname] = $data;        

        $offset += strlen(serialize($data));    

    }    

    return $return_data;

}

$un_data = unserialize_php($data);

echo '<pre>';

var_dump(unserialize_php($un_data));


//输出数据

//array(1) {

//    ["name"]=>

//    string(4) "Bihu"

//}




Thanks ~


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值