php ssion的保存机制有两种方式,ssion.save_handler = files
和ssion.save_handler = ur
,具体选用哪种方式保存,可以通过配置php.ini文件实现。
一、使用读写文件的方式保存 ssion 数据(ssion.save_handler = files)
1、 ssion_start()
(1). ssion_start()
是ssion机制的开始,它有一定概率开启垃圾回收,因为ssion是存放在文件中,php自身的垃圾回收是无效的,ssion的回收是要删文件的,这个概率是根据php.ini的配置决定的,但是有的系统是 ssion.gc_probability = 0
,这也就是说概率是0,而是通过cron脚本来实现垃圾回收。
ssion.gc_probability = 1ssion.gc_divisor = 1000ssion.gc_maxlifetime = 1440//过期时间 默认24分钟//概率是 ssion.gc_probability/ssion.gc_divisor 结果 1/1000, //不建议设置过小,因为ssion的垃圾回收,是需要检查每个文件是否过期的。ssion.save_path = //好像不同的系统默认不一样,有一种设置是 "n;/path"//这是随机分级存储,这个样的话,垃圾回收将不起作用,需要自己写脚本
(2). ssion会判断当前是否有$_cookie[ssion_name()];ssion_name()
返回保存ssion_id的cookie键值,这个值可以从php.ini找到
ssion.name = phpssid //默认值phpssid
(3). 如果不存在会生成一个ssion_id,然后把生成的ssion_id作为cookie的值传递到客户端。
相当于执行了下面cookie 操作,注意的是,这一步执行了tcookie()操作,cookie是在header头中发送的,这之前是不能有输出的,php有另外一个函数 ssion_regenerate_id(),如果使用这个函数,这之前也是不能有输出的。
tcookie(ssion_name(), ssion_id(), ssion.cookie_lifetime,//默认0 ssion.cookie_path,//默认'/'当前程序跟目录下都有效 ssion.cookie_domain,//默认为空 )
(4). 如果存在那么ssion_id = $_cookie[ssion_name];
然后去ssion.save_path指定的文件夹里去找名字为'ss_' . ssion_id()
的文件;读取文件的内容反序列化,然后面膜怎么用放到$_ssion中。
2、为$_ssion赋值
比如新添加一个值$_ssion['test'] = 'blah';
那么这个$_ssion只会维护在内存中,当脚本执行结束的时候,用把$_ssion的值写入到ssion_id指定的文件夹中,然后关闭相关资源。
这个阶段有可能执行更改ssion_id的操作,比如销毁一个旧的的ssion_id,生成一个全新的ssion_id,一半用在自定义 ssion操作,角色的转换上,比如drupal.drupal的匿名用户有一个ssion的,当它登录后需要换用新的ssion_id。
if (ist($_cookie[ssion_name()])) { tcookie(ssion_name(), '', time() - 42000, '/');//旧ssion cookie过期}ssion_regenerate_id();//这一步会生成新的ssion_id//ssion_id()返回的是新的值
3、写入ssion操作
在脚本结束的时候会执行ssion写入操作,把$_ssion中值写入到ssion_id命名的文件中,可能已经存在,可能需要创建新的文件。
4、销毁ssion
ssion发出去的cookie一般属于即时cookie,保存在内存中,当浏览器关闭后,才会过期,假如需要人为强制过期,比如 退出登录,而不是关闭浏览器,那么就需要在代码里销毁ssion,方法有很多
tcookie(ssion_name(), ssion_id(), time() – 8000000, ..);//退出登录前执行ust($_ssion);//这会删除所有的$_ssion数据,刷新后,有cookie传过来,但是没有数据。ssion_destroy();//这个作用更彻底,删除$_ssion 删除ssion文件,和ssion_id当不关闭浏览器的情况下,再次刷新,后两者都会有cookie传过来,但是找不到数据
二、自定议ssion处理机制(ssion.save_handler = ur)
用户自定义ssion处理机制,更加直观
* ssion_t_save_handler('open', 'clo', 'read', 'write', 'destroy', 'gc');
1、ssion_start()
执行open($save_path, $ssion_name)
打开ssion操作句柄;$save_path 在ssion.save_handler = files的情况下它就是ssion.save_path,但是如果用户自定的话,这个两个参数都用不上,直接返回true
执行read($id)从中读取数据;这个参数是自动传递的就是ssion_id(),可以通过这个值进行操作。
2、脚本执行结束
执行
write($id, $ss_data) //两个参数,很简单
3、假如用户需要ssion_destroy()自然景观作文
先执行destroy.在执行第2步
一个实际例子:
//ssion初始化的时候调用function open($save_path, $ssion_name){ global $ss_save_path; $ss_save_path = $save_path; return(true);}//关闭的时候调用function clo(){ return(true);}function read($id){ global $ss_save_path; $ss_file = "$ss_save_path/ss_$id"; return (string) @file_get_contents($ss_file);}//脚本执行结束之前,执行写入操作function write($id, $ss_data){ echo "sdfsf"; global $ss_save_path; $ss_file = "$ss_save_path/ss_$id"; if ($fp = @fopen($ss_file, "w")) { $return = fwrite($fp, $ss_data); fclo($fp); return $return; } el { return(fal); }}function destroy($id){ global $ss_save成也萧何_path; $ss_file = "$ss_save_path/ss_$id"; return(@unlink($ss_file));}function gc($maxlifetime){ global $ss_save_path; foreach (glob("$ss_sav关于新年的英语手抄报e_path/ss_*") as $filename) { if (filemtime($filename) + $maxlifetime < time()) { @unlink($filename); } } return true;}
补充——涉及函数进口奶粉有哪些品牌
ssion_start();// 开启ssion回话,其中ssion_id()的值是一次独立会话的标志ssion_name(); // 默认是phpssid,在php.ini文件中可以自行配置。ssion_id(); // 在cookie中的体现是,ssion_name为键,ssion_id为值tcookie(); // 要想起作用,必须有页面的刷新ssion_destory(); // ssion_destroy — 销毁一个会话中的全部数据
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对www.887551.com的支持。如果你想了解更多相关内容请查看下面相关链接
本文发布于:2023-04-07 11:17:51,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/52f54602f7382686f45e7248f26fca28.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:PHP SESSION机制的理解与实例.doc
本文 PDF 下载地址:PHP SESSION机制的理解与实例.pdf
留言与评论(共有 0 条评论) |