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 相关文章推荐
PHP4 与 MySQL 交互使用
Oct 09 PHP
php你的验证码安全码?
Jan 02 PHP
PHP定时执行计划任务的多种方法小结
Dec 19 PHP
php中CI操作多个数据库的代码
Jul 05 PHP
PHP Curl出现403错误的解决办法
May 29 PHP
用 Composer构建自己的 PHP 框架之设计 MVC
Oct 30 PHP
Smarty foreach控制循环次数的一些方法
Jul 01 PHP
php中注册器模式类用法实例分析
Nov 03 PHP
php实现基于openssl的加密解密方法
Sep 30 PHP
php微信公众平台开发(三)订阅事件处理
Dec 06 PHP
解决php-fpm.service not found问题的办法
Jun 06 PHP
PHP7匿名类的用法示例
Apr 05 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代码中使用换行及(\n或\r\n和br)的应用
2013/02/02 PHP
浅析PHP Socket技术
2013/08/02 PHP
PHP分页详细讲解(有实例)
2013/10/30 PHP
php通过asort()给关联数组按照值排序的方法
2015/03/18 PHP
PHP加密解密类实例代码
2016/07/20 PHP
PHP利用正则表达式将相对路径转成绝对路径的方法示例
2017/02/28 PHP
PHP设计模式之单例模式原理与实现方法分析
2018/04/25 PHP
Laravel框架验证码类用法实例分析
2019/09/11 PHP
Prototype使用指南之enumerable.js
2007/01/10 Javascript
jQuery根据纬度经度查看地图处理程序
2013/05/08 Javascript
javascript操作table(insertRow,deleteRow,insertCell,deleteCell方法详解)
2013/12/16 Javascript
jquery实现submit提交表单
2015/02/03 Javascript
JavaScript提高网站性能优化的建议(二)
2016/07/24 Javascript
JS实现标签页切换效果
2017/05/04 Javascript
JavaScript实现打印星型金字塔功能实例分析
2017/09/27 Javascript
原生JS实现的多个彩色小球跟随鼠标移动动画效果示例
2018/02/01 Javascript
jQuery实现获取动态添加的标签对象示例
2018/06/28 jQuery
vue-自定义组件传值的实例讲解
2018/09/18 Javascript
Vue实现本地购物车功能
2018/12/05 Javascript
详解可以用在VS Code中的正则表达式小技巧
2019/05/14 Javascript
vscode vue 文件模板的配置方法
2019/07/23 Javascript
laypage+SpringMVC实现后端分页
2019/07/27 Javascript
Nodejs文件上传、监听上传进度的代码
2020/03/27 NodeJs
[14:56]教你分分钟做大人:巫医
2014/10/30 DOTA
Python批量更改文件名的实现方法
2017/10/29 Python
Opencv+Python实现图像运动模糊和高斯模糊的示例
2019/04/11 Python
对python中各个response的使用说明
2020/03/28 Python
python 实现性别识别
2020/11/21 Python
video.js支持m3u8格式直播的实现示例
2020/05/20 HTML / CSS
Nike德国官网:Nike.com (DE)
2018/11/13 全球购物
小学教师事迹材料
2014/01/13 职场文书
股东出资证明书范例
2014/10/04 职场文书
Python Numpy之linspace用法说明
2021/04/17 Python
Redis读写分离搭建的完整步骤
2021/09/14 Redis
Win11绿屏怎么办?Win11绿屏死机的解决方法
2021/11/21 数码科技
Win11怎么添加用户?Win11添加用户账户的方法
2022/07/15 数码科技