PHP中SESSION使用中的一点经验总结


Posted in PHP onMarch 30, 2012

SESSION会话开启时,会首先发送一个对浏览器的唯一标识session_id的cookie(名字为PHPSESSID可以通过session_name()获取),同session.save_handler = files的情况下,在服务器的指定目录(如temp)下生成一个没有后缀的文件,名字是

'sess_" + 'session_id';

PHP中SESSION使用中的一点经验总结 
这样就完成了基本的设置。那么在下一次发起http请求时,首先浏览器会发送这个当前域名下的所有cookie名字和值过去,这样服务器就能根据cookie中的session_id来去读取session文件,而不会混淆这个session属于谁。

这一步具体如下:

SESSION发送一个对浏览器的唯一cookie变量session_id,这个session_id变量有名字、有值。变量名(name)默认为PHPSESSID,变量值(value)为apach随机生成的字符串,类似rvag9m368vim7k8g4v7k2ank70 。通常说的session_id其实是指这个唯一的字符串rvag9m368vim7k8g4v7k2ank70。

具体的在FF的HTTP响应头下如此:
PHP中SESSION使用中的一点经验总结

session_start();
 在程序中上面一句就完成了上面的功能,假如浏览器没有发送PHPSESSID的cookie过来就发送一个过去,有就读取这个cookie,这样就能维持同一个会话。

好了既然知道了session的工作原理,那么我们可以推测到假如服务器端sess_rvag9m368vim7k8g4v7k2ank70 这个文件我们手动删除了,那么session失效,假如浏览器cookie失效,那么session照样失效。
在手动的情况下:
在服务器端,可以用
session_ destroy() 或者session_ unset()

来使其失效。
在浏览器端:
可以直接
?setcookie('PHPSESSID','',123);

让cookie过期,或者另外一种方式,但不能立即失效
?session_set_cookie_params($time);//当前时间戳上的秒,例如60,即让其60秒后过期,<SPAN style="COLOR: #ff0000">不要用时间戳+自己设定的时间。 </SPAN>

上面所讲的都是让session提前过期,但是想直接让session延迟行不行呢?除了修改配置(session.gc_maxlifetime)是不行的,在php.ini里面session.gc_maxlifetime 设置过期时间,到了这个时间,就有session.gc_probability /session.gc_divisor的概率被回收。假如到了这个时间,并且启动了GC进程,GC会去读取session文件的修改时间(mtime),发现大于和当前时间相减后大于session.gc_maxlifetime ,立刻删除。到此,我们也就明白了如何保持这个会话呢,只能在session.gc_maxlifetime 内,必须有用户在访问,每次访问都去修改下session,这样就这个session又多出session.gc_maxlifetime的存活时间。
另外说一下session.cookie_lifetime ,设置PHPSESSID在浏览器的存活时间,默认为0,IE下我发现是正常的,浏览器重启即cookie失效;FF下还继续存在。设置session.cookie_lifetime可以用session_set_cookie_params,
?session_set_cookie_params(60);//60 s session_start();
session.gc_maxlifetime和session.cookie_lifetime 共同决定了session的生存时间。
-------------------------------------------------------------
刚刚找了一下firefox cookie会话过期的资料,发现如下

This is apparently by design. Check out this Bugzilla bug:https://bugzilla.mozilla.org/show_bug.cgi?id=443354

Firefox has a feature where you close Firefox and it offers to save all your tabs, and then you restore the browser and those tabs come back. That's called session restore. What I didn't realize is that it'll also restore all the session cookies for those pages too! It treats it like you had never closed the browser.

This makes sense in the sense that if your browser crashed you get right back to where you were, but is a little disconcerting for web devs used to session cookies getting cleared. I've got some old session cookies from months ago that were set by sites I always have open in tabs.

To test this out, close all the tabs in your browser, then close the browser and restart it. I think the session cookies for your site should clear in that case. Otherwise you'd have to turn off session restore.

这是火狐的会话保存功能,FF设计就是如此。可以做这个close all the tabs in your browser, then close the browser and restart it测试,看看是否还保存着。

PHP 相关文章推荐
PHP的FTP学习(一)[转自奥索]
Oct 09 PHP
PHP Parse Error: syntax error, unexpected $end 错误的解决办法
Jun 05 PHP
如何用PHP实现插入排序?
Apr 10 PHP
PHP笔记之:基于面向对象设计的详解
May 14 PHP
使用cookie实现统计访问者登陆次数
Jun 08 PHP
php天翼开放平台短信发送接口实现方法
Dec 22 PHP
php判断两个浮点数是否相等的方法
Mar 14 PHP
php将字符串随机分割成不同长度数组的方法
Jun 01 PHP
Ubuntu VPS中wordpress网站打开时提示”建立数据库连接错误”的解决办法
Nov 03 PHP
php实现的二分查找算法示例
Jun 20 PHP
PHP基于IMAP收取邮件的方法示例
Aug 07 PHP
Laravel中9个不经常用的小技巧汇总
Apr 16 PHP
PHP __autoload()方法真的影响性能吗?
Mar 30 #PHP
phpmyadmin3 安装配置图解教程
Mar 29 #PHP
php 注释规范
Mar 29 #PHP
php 计划任务 检测用户连接状态
Mar 29 #PHP
MySQL的FIND_IN_SET函数使用方法分享
Mar 27 #PHP
php提示无法加载或mcrypt没有找到 PHP 扩展 mbstring解决办法
Mar 27 #PHP
phpMyAdmin 链接表的附加功能尚未激活问题的解决方法(已测)
Mar 27 #PHP
You might like
php实现的仿阿里巴巴实现同类产品翻页
2009/12/11 PHP
JQuery困惑—包装集 DOM节点
2009/10/16 Javascript
引入JS文件IE6报语法错误或缺少对象问题的解决方法
2014/01/09 Javascript
javascript如何判断输入的url是否正确
2014/04/11 Javascript
js调试系列 初识控制台
2014/06/18 Javascript
Javascript实现Web颜色值转换
2015/02/05 Javascript
jQuery实现鼠标单击网页文字后在文本框显示的方法
2015/05/06 Javascript
Bootstrap每天必学之进度条
2015/11/30 Javascript
JavaScript Math 对象常用方法总结
2016/04/28 Javascript
Bootstrap轮播插件中图片变形的终极解决方案 使用jqthumb.js
2016/07/10 Javascript
jQuery源码分析之init的详细介绍
2017/02/13 Javascript
vue使用axios跨域请求数据问题详解
2017/10/18 Javascript
JS实现数组简单去重及数组根据对象中的元素去重操作示例
2018/01/05 Javascript
vue-router重定向和路由别名的使用讲解
2019/01/19 Javascript
JavaScript中常用的简洁高级技巧总结
2019/03/10 Javascript
JS实现倒序输出的几种常用方法示例
2019/04/13 Javascript
微信小程序返回上一页传参并刷新过程解析
2019/12/13 Javascript
JavaScript ECMA-262-3 深入解析(一):执行上下文实例分析
2020/04/25 Javascript
JS实现简单贪吃蛇小游戏
2020/10/28 Javascript
[06:35]2014DOTA2国际邀请赛 老男孩梦圆西雅图中国军团世界最强
2014/07/22 DOTA
[00:53]2015国际邀请赛 中国区预选赛一触即发
2015/05/14 DOTA
利用Django框架中select_related和prefetch_related函数对数据库查询优化
2015/04/01 Python
python多进程实现进程间通信实例
2017/11/24 Python
python3.5 tkinter实现页面跳转
2018/01/30 Python
使用python快速在局域网内搭建http传输文件服务的方法
2019/11/14 Python
python支持多继承吗
2020/06/19 Python
Selenium alert 弹窗处理的示例代码
2020/08/06 Python
使用CSS媒体查询(Media Queries)和JavaScript判断浏览器设备类型的方法
2014/04/03 HTML / CSS
幼儿园实习生辞职信
2014/01/20 职场文书
有关打架的检讨书
2014/01/25 职场文书
2014年元旦联欢会活动策划方案
2014/02/16 职场文书
保安岗位职责
2014/02/21 职场文书
毕业晚会主持词
2014/03/24 职场文书
保研推荐信
2014/05/09 职场文书
2015年卫生局工作总结
2015/07/24 职场文书
Java9新特性对HTTP2协议支持与非阻塞HTTP API
2022/03/16 Java/Android