彻底理解PHP的SESSION机制
session_start()是session机制的开始,它有一定概率开启垃圾回收,因为session是存放在文件中,
一、默认机制,用磁盘文件来实现PHP会话。php.ini配置:session.save_handler = files
1、session_start()
A、 session_start()是session机制的开始,它有一定概率开启垃圾回收,因为session是存放在文件中,
PHP自身的垃圾回收是无效的,SESSION的回收是要删文件的,这个概率是根据php.ini的配置决定的,
但是有的系统是 session.gc_probability =0,这也就是说概率是0,而是通过cron脚本来实现垃圾回收。
session.gc_probability =1
session.gc_divisor =1000
session.gc_maxlifetime =1440//过期时间 默认24分钟
//概率是 session.gc_probability/session.gc_divisor 结果 1/1000,
//不建议设置过小,因为session的垃圾回收,是需要检查每个文件是否过期的。
session.save_path =//好像不同的系统默认不一样,有一种设置是 “N;/path”
//这是随机分级存储,这个样的话,垃圾回收将不起作用,需要自己写脚本
B、 session会判断当前是否有$_COOKIE[session_name()];session_name()返回保存session_id的COOKIE键值,
这个值可以从php.ini找到
session.name = PHPSESSID //默认值PHPSESSID
C、 如果不存在会生成一个session_id,然后把生成的session_id作为COOKIE的值传递到客户端.
相当于执行了下面COOKIE 操作,注意的是,这一步执行了setcookie()操作,COOKIE是在header头中发送的,
这之前是不能有输出的,PHP有另外一个函数 session_regenerate_id() 如果使用这个函数,这之前也是不能有输出的。
1 2 3 4 5 6 | setcookie(session_name(), session_id(), session.cookie_lifetime, //默认0 session.cookie_path, //默认’/’当前程序跟目录下都有效 session.cookie_domain, //默认为空 ) |
D、 如果存在那么session_id =$_COOKIE[session_name];
然后去session.save_path指定的文件夹里去找名字为’SESS_’.session_id()的文件.
读取文件的内容反序列化,然后放到$_SESSION中
2、 为$_SESSION赋值
比如新添加一个值$_SESSION[‘test’] =’blah'; 那么这个$_SESSION只会维护在内存中,当脚本执行结束的时候,
用把$_SESSION的值写入到session_id指定的文件夹中,然后关闭相关资源. 这个阶段有可能执行更改session_id的操作,
比如销毁一个旧的的session_id,生成一个全新的session_id.一半用在自定义 session操作,角色的转换上,
比如Drupal.Drupal的匿名用户有一个SESSION的,当它登录后需要换用新的session_id
1 2 3 4 5 | if (isset($_COOKIE[session_name()])) { setcookie(session_name(),”,time() 42000 ,’/’); //旧session cookie过期 } session_regenerate_id(); //这一步会生成新的session_id //session_id()返回的是新的值 |
本文由 帝一博客 原创发布。用户在本站发布的原创内容(包括但不仅限于回答、文章和评论),著作权均归用户本人所有。独家文章转载,请联系邮箱:17762131@qq.com。获得授权后,须注明本文地址: https://bubukou.com/phpjiqiao/108.html
-
PHP 扫描微信公众号二维码,关注并自动登录网站
2020-10-27 16:35
-
fastadmin git 安装过程记录笔记
2020-10-03 17:34
-
PHP 多个redis key 删除遇到Function R...
2020-08-19 16:01
-
PHP-Redis,keys()对键名进行模糊查询
2020-08-19 15:34
-
php连接redis
2019-12-16 10:00
-
linux mshowfat命令显示MS-DOS文件在FAT...
2019-09-05 08:02
-
PHP中重定向网页跳转页面的方法
2019-07-09 11:38
-
CI框架中使用join实现多表联合查询
2019-06-13 20:56
-
Laravel 5.3 学习笔记之错误日志
2019-06-13 20:56
-
PHP批量生成静态HTML的简单原理和方法
2019-06-13 20:55
网友留言评论