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

更新时间:2012年03月30日 23:07:30   作者:

最近在网上的交流中发现大家对SESSION的使用上有很多误区,本质上就是不了解SESSION的工作原理

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

'sess_" + 'session_id';

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

这一步具体如下:

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

具体的在FF的HTTP响应头下如此:

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秒后过期,不要用时间戳+自己设定的时间。

上面所讲的都是让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单元测试利器:PHPUNIT初探文章中,我们对phpunit有了一个初步的认识,在本文中将继续深入讲解下phpunit中的一些用法。2011-03-03

这篇文章主要给大家整理汇总了PHP 信号管理知识的相关资料,需要的朋友可以参考下2017-02-02

php 获取百度的热词数据的代码,返回数组2012-02-02

PHP计划任务、定时执行任务的实现用到的函数 ignore_user_abort(),set_time_limit(0),sleep($interval) 此代码只要运行一次后关闭浏览器即可。2011-04-04

这篇文章主要介绍了php绘图之生成饼状图的方法,涉及GD库中imagefilledarc方法的使用技巧,需要的朋友可以参考下2015-01-01

这篇文章主要介绍了PHP使用DirectoryIterator显示下拉文件列表的方法,涉及php使用DirectoryIterator操作文件的技巧,需要的朋友可以参考下2015-03-03

有时候我们需要检查 URL 链接是否已经有参数,然后根据需要判断是添加 ? 还是添加 & 在结尾,这只是一个很小的技巧,但是在做分页或者页面跳转时还是有些用处的。2010-02-02

本文主要介绍了PHP递归创建多级目录,这是一道经典的php程序员面试题,分享了解题过程和思路,需要的朋友可以参考一下2015-11-11

大家都知道header函数中Location类型的标头是一种特殊的header调用,常用来实现页面跳转,在新手刚学习的时候有些注意事项要注意,下面通过本文来详细看看吧。2016-10-10

这篇文章主要介绍了php生成xml时添加CDATA标签的方法,实例讲述了php操作XML文件的技巧,非常具有实用价值,需要的朋友可以参考下2014-10-10

最新评论

php中session总结,PHP中SESSION使用中的一点经验总结相关推荐

  1. 负载均衡中使用 Redis 实现共享 Session

    最近在研究Web架构方面的知识,包括数据库读写分离,Redis缓存和队列,集群,以及负载均衡(LVS),今天就来先学习下我在负载均衡中遇到的问题,那就是session共享的问题. 一.负载均衡 负载均 ...

  2. html点击按钮删除session,Asp.net中安全退出时清空Session或Cookie的实例代码

    概览: 网站中点击退出,如果仅仅是重定向到登录/出页面,此时在浏览器地址栏中输入登录后的某个页面地址如主页,你会发现不用登录就能访问.这种所谓的退出并不是安全的. 那么怎样做到安全退出呢? 那就是点击 ...

  3. php删除session中的值,PHP中session变量的销毁

    1.何为session?相当于一个客户端(可以是浏览器.app.ftp等其他,而且同一个浏览器多开几个又算是不同的客户端)对服务器的一个访问,这个期间服务器为此建立一个唯一的标示(session_id ...

  4. .net session 有效时间_Python中requests模拟登录的三种方式(携带cookie/session进行请求网站)...

    这篇文章主要介绍了python中requests模拟登录的三种方式(携带cookie/session进行请求网站),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋 ...

  5. Nhibernate中session的状态与session.connection.state状态的差别的解释

    在项目中用到了nhibernate,但是需要判断数据连接的状态,在NHIbernate的文档中找了半天,英文的中文的都看了一遍,都没找到相关的说明 .后来在Hibernate的论坛上才找到了一些说明. ...

  6. WWDC 2013 Session笔记 - iOS7中的多任务

    这是我的WWDC2013系列笔记中的一篇,完整的笔记列表请参看这篇总览.本文仅作为个人记录使用,也欢迎在许可协议范围内转载或使用,但是还烦请保留原文链接,谢谢您的理解合作.如果您觉得本站对您能有帮助, ...

  7. java session 数量_java中使用session监听实现同帐号登录限制、登录人数限制

    本文主要介绍了java中使用session监听实现同帐号登录限制.登录人数限制,具体代码如下: 问题域: 1.同帐号登录:若此帐号已登录,不可再次登录(与QQ模式相反). 2.登录人数限制,超过.已达 ...

  8. PHP 分布式集群中session共享问题以及session有效期的设置

    一.Session的原理 以下以默认情况举例: session_start();之后,会生成一个唯一的session_id,每一个用户对应唯一一个session_id,每一个session_id对应服 ...

  9. Struts2项目中的JSP如何访问Session对象

    Struts2 项目中,Session 对象存放在 ValueStack 的 context 对象中,context 是 Map 对象,那么要从 context 对象中获取到 Session 对象,就 ...

  10. php session 释放,php中删除Session和销毁Session的方法

    删除某个session值可以使用PHP的unset函数,删除后就会从全局变量$_SESSION中去除,无法访问.session_start(); $_SESSION['name'] = 'jobs'; ...

最新文章

  1. cordova 安装ssl证书_cordova环境配置(android)
  2. 趣味图形之 余弦函数cos与直线相交(另一种相交)
  3. 直接运行PowerShell脚本
  4. 牛客第六场 H-Hopping Rabbit
  5. 022-红黑树(三)
  6. 注解_案例_简单的测试框架
  7. 链表和顺序表的一些区别
  8. windows 2008 R2系统安装拨号v p n详细配置
  9. Linux驱动(14)--字符类设备与驱动
  10. 怎么设置计算机管理员权限,Windows7管理员权限怎么设置?
  11. [other] 代码量代码复杂度统计-lizard
  12. powermock私有字段_使用PowerMock的EasyMock私有方法模拟
  13. 读《华为研发》第2版
  14. Spring核心JAR包
  15. 百度地图开放平台web api 获取某项目方圆一公里的poi信息
  16. python tkinter 实现图片格式批量转换小工具
  17. 数学物理方法 数学物理方程
  18. 鸿蒙系统手机如何投影,小屏如何换大屏 五种方法教你把手机画面投影到电视上...
  19. python 图像拼接_python实现图像拼接功能
  20. java调用rapidminer_基于RapidMiner开发问题和解决

热门文章

  1. Android开发之解决父控件拦截子控件事件问题
  2. source insight技巧
  3. android原生browser分析(一)--Application
  4. struts2 从一个action 跳转到另一个action的两种方法
  5. 设计模式系列--Singleton
  6. python第四周作业_马哥2016全新Linux+Python高端运维班第四周作业
  7. matlab 纽马克 激励,newmark (纽马克)计算结果动力学响应的matlab程序
  8. python np数组中括号里面‘:n‘与‘n:‘什么意思
  9. 自定义数据库连接池和Druid介绍
  10. 栈的应用 算术表达式转换为后缀表达式