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模板技术原理【一】
Jan 10 PHP
PHP $_FILES函数详解
Mar 09 PHP
php中使用cookie来保存用户登录信息的实现代码
Mar 08 PHP
关于PHP实现异步操作的研究
Feb 03 PHP
PHP5常用函数列表(分享)
Jun 07 PHP
PHP中构造函数和析构函数解析
Oct 10 PHP
php使用NumberFormatter格式化货币的方法
Mar 21 PHP
Zend Framework创建自己的动作助手详解
Mar 05 PHP
全面解读PHP的Yii框架中的日志功能
Mar 17 PHP
PHP的Yii框架中行为的定义与绑定方法讲解
Mar 18 PHP
php安装ssh2扩展的方法【Linux平台】
Jul 20 PHP
详解PHP中curl_multi并发的实现
Jun 08 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中输出转义JavaScript代码的实现代码
2011/04/22 PHP
PHP学习笔记之字符串编码的转换和判断
2014/05/22 PHP
php几个预定义变量$_SERVER用法小结
2014/11/07 PHP
thinkphp配置连接数据库技巧
2014/12/02 PHP
PHP数组操作简单案例分析
2016/10/15 PHP
Jquery 滑入滑出效果实现代码
2010/03/27 Javascript
animate动画示例(泪奔的小孩)及stop和delay的使用
2013/05/06 Javascript
javascript使用smipleChart实现简单图表
2015/01/02 Javascript
JQuery删除DOM节点的方法
2015/06/11 Javascript
jquery插件pagination实现无刷新ajax分页
2015/09/30 Javascript
AngularJS中的过滤器filter用法完全解析
2016/04/22 Javascript
jquery动态遍历Json对象的属性和值的方法
2016/07/27 Javascript
Javascript中字符串replace方法的第二个参数探究
2016/12/05 Javascript
Angular 通过注入 $location 获取与修改当前页面URL的实例
2017/05/31 Javascript
js获取对象,数组所有属性键值(key)和对应值(value)的方法示例
2019/06/19 Javascript
Vue实现剪切板图片压缩功能
2020/02/04 Javascript
jquery实现烟花效果(面向对象)
2020/03/10 jQuery
详解Typescript 内置的模块导入兼容方式
2020/05/31 Javascript
Vue ElementUI实现:限制输入框只能输入正整数的问题
2020/07/31 Javascript
python下解压缩zip文件并删除文件的实例
2018/04/24 Python
Python转换时间的图文方法
2019/07/01 Python
Python 实例方法、类方法、静态方法的区别与作用
2019/08/14 Python
推荐8款常用的Python GUI图形界面开发框架
2020/02/23 Python
使用SQLAlchemy操作数据库表过程解析
2020/06/10 Python
详解CSS3的图层阴影和文字阴影效果使用
2016/06/09 HTML / CSS
CSS3 毛玻璃效果
2019/08/14 HTML / CSS
Rockport乐步美国官网:风靡美国的白宫鞋
2016/11/24 全球购物
如何利用XMLHTTP检测URL及探测服务器信息
2013/11/10 面试题
一个J2EE项目团队的主要人员组成是什么
2012/06/04 面试题
会计电算一体化个人简历的自我评价
2013/10/15 职场文书
主管会计岗位职责
2014/03/13 职场文书
2015初中团支部工作总结
2015/07/21 职场文书
2015年度个人工作总结报告
2015/10/24 职场文书
2017公司年会主持人开幕词
2016/03/04 职场文书
一起来学习Python的元组和列表
2022/03/13 Python
漫画「古见同学有交流障碍症」第25卷封面公开
2022/03/21 日漫