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

2015-01-24信息快讯网

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

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 curl_setopt 函数的相关应用及介绍
深入PHP magic quotes的详解
探讨:parse url解析URL,返回其组成部分
解决File size limit exceeded 错误的方法
深入Memcache的Session数据的多服务器共享详解
探讨Hessian在PHP中的使用分析
探讨:使用XMLSerialize 序列化与反序列化
coreseek 搜索英文的问题详解
使用session判断用户登录用户权限(超简单)
探讨如何使用SimpleXML函数来加载和解析XML文档
探讨如何把session存入数据库
基于session_unset与session_destroy的区别详解
PHP5中Cookie与 Session使用详解
PHP新手用的Insert和Update语句构造类
PHP __autoload()方法真的影响性能吗?
MySQL的FIND_IN_SET函数使用方法分享
simplehtmldom Doc api帮助文档
PHP运行出现Notice : Use of undefined constant 的完美解决方案分享
PHP中call_user_func_array()函数的用法演示
非常好用的两个PHP函数 serialize()和unserialize()
php addslashes及其他清除空格的方法是不安全的
php中可能用来加密字符串的函数[base64_encode、urlencode、sha1]
Uncaught exception com_exception with message Failed to create COM object
php读取mysql乱码,用set names XXX解决的原理分享
php中XMLHttpRequest(Ajax)不能设置自定义的Referer的解决方法
php中$_REQUEST、$_POST、$_GET的区别和联系小结
Session保存到数据库的php类分享
php正则表达式(regar expression)
PHP session会话的安全性分析
php数据结构 算法(PHP描述) 简单选择排序 simple selection sort
php中设置多级目录session的问题
从手册去理解分析PHP session机制
session在PHP大型web应用中的使用
©2014-2024 dbsqp.com