什么是Session机制
这篇文章主要介绍“什么是Session机制”,在日常操作中,相信很多人在什么是Session机制问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”什么是Session机制”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
成都创新互联主营中阳网站建设的网络公司,主营网站建设方案,重庆App定制开发,中阳h5微信小程序定制开发搭建,中阳网站营销推广欢迎中阳等地区企业咨询
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 "
";
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 '
';var_dump(unserialize_php($un_data));
//输出数据
//array(1) {
// ["name"]=>
// string(4) "Bihu"
//}
到此,关于“什么是Session机制”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注创新互联网站,小编会继续努力为大家带来更多实用的文章!
当前标题:什么是Session机制
URL标题:http://cdiso.cn/article/pecocj.html