有详细代码更好
看教程什么的 都说 浏览器关闭后session自动销毁,但是我在本地测试,发现程序关闭后session不能自动销毁,另外php.ini 默认是20分钟后session自动销毁,也没反应,希望懂得的出来解释
42 个解决方案
#1
window onunload事件中调用session_destroy();
#2
是自动销毁的
Garbage Collection process对过期session销毁,但是,并非一过期就销毁,换句话说,它是以一定的几率进行的。如果一过期就销毁,当访问量大的时候,销毁session势必会占用相当的资源
你可以看看php配置文件中
session.gc_probability = 1
session.gc_divisor = 1000
这两个参数的意思千分之一的几率启动GC
Garbage Collection process对过期session销毁,但是,并非一过期就销毁,换句话说,它是以一定的几率进行的。如果一过期就销毁,当访问量大的时候,销毁session势必会占用相当的资源
你可以看看php配置文件中
session.gc_probability = 1
session.gc_divisor = 1000
这两个参数的意思千分之一的几率启动GC
#3
这个写在 body 里面?? 销毁的太快了。。。。。
#4
自动销毁大概多长时间??还是按临时文件夹超过多少自动销毁??
#5
写在body里面不大好,这就意味着每个页面都得写上。。。
#6
那应该怎么个写法,我也感觉有些复杂。。。。
#7
所有浏览器关闭,才会销毁..
应该是这样的..ff浏览器?
应该是这样的..ff浏览器?
#8
ie 和 FF 都测试了,看了C:\WINDOWS\Temp 没有销毁session
#9
session是存在于服务器的,当你关闭浏览器的时候就代表一次会话结束.
#10
对,会话是结束了,但是服务器上的session并没有被销毁
#11
php完全做到,不行!!!!
asp,.net还可以
asp,.net还可以
#12
#2楼说的很清楚了.
是以一定几率进行GC,默认情况下每次请求以1/100的几率进行SESSION GC,换句话说,请求100次就有可能命中一次session gc.也就是说session虽然过期了,但不一定会立即被删除.session数据存于文件是一般这么设置的,你想想,一旦你的用户量上来了,你设置100/100的几率删除session,那么每发一次请求,就处理一次session gc,这个势必增加了一些不必要的i/o损耗.
而且会话是否结束,不应该仅凭关闭浏览器视为会话的结束,拿session use cookie来说,这要看cookie的失效设置是否设置了关闭浏览器,cookie即过期.即php.ini的session.cookie_lifetime是否设置为0.否则的话,cookie在有效期内,即使是关闭浏览器再重新打开,请求头内一样保留之前的session id,这时候发送请求给服务器,只要相应的session文件被删除,会话仍然会继续.
是以一定几率进行GC,默认情况下每次请求以1/100的几率进行SESSION GC,换句话说,请求100次就有可能命中一次session gc.也就是说session虽然过期了,但不一定会立即被删除.session数据存于文件是一般这么设置的,你想想,一旦你的用户量上来了,你设置100/100的几率删除session,那么每发一次请求,就处理一次session gc,这个势必增加了一些不必要的i/o损耗.
而且会话是否结束,不应该仅凭关闭浏览器视为会话的结束,拿session use cookie来说,这要看cookie的失效设置是否设置了关闭浏览器,cookie即过期.即php.ini的session.cookie_lifetime是否设置为0.否则的话,cookie在有效期内,即使是关闭浏览器再重新打开,请求头内一样保留之前的session id,这时候发送请求给服务器,只要相应的session文件被删除,会话仍然会继续.
#13
一直以为是浏览器关闭了就会删除session, 现在看来貌似不是这样的。
学习2楼和12楼。
学习2楼和12楼。
#14
手误了
..只要相应的session文件 未被删除,会话仍然会继续.
#15
是个解决办法~~~但是如果访问量比较大的话~这种方式服务器可能会吃不消
#16
我这有个折中的办法~~就是你在服务器后台跑个脚本~~定期扫描用户session文件,超过多长时间没改变的直接删除,前提是你在前端页面做个隐藏的ajax(目的是保持session文件的更改时间最新),这样相当于你手写完成了php的一部分session处理机制!
#17
不用去,会自动垃圾回收
#18
不错,学习了
#19
是个头痛问题,在网上找了好几天,都没找到解决办法。。。。。希望大家有好的解绝办法。。。
#20
////销毁session////
function sessionDestroy() {
session_destroy();
setcookie(session_name(),'',time()-3600);
$_SESSION = array();
}
function sessionDestroy() {
session_destroy();
setcookie(session_name(),'',time()-3600);
$_SESSION = array();
}
#21
如果是session use cookie,使用file存储,一般就保留默认配置值,服务器以1/100的几率处理过期session,没必要每次请求都进行session gc处理.
如果自己处理,你要删除过期session,总得遍历session保存目录的所有的session文件吧?你想想用户量如果很大,每个用户登录浏览服务器的页面,就会生成session文件,那得多少份session文件,然后遍历每个session文件,判断文件上次访问时间离当前时间是否超出了session_maxlife设置的时间,超过即删除。你如果用php去做这个工作,效率上不是更慢了吗!?你还不如设置php.ini的session.gc_probability = 100和session.gc_divisor = 100呢,但是一般不需要服务器接收每次http请求都处理session gc就是因为效率资源上的考量。几十万的访问量,每次请求都进行文件读删,这是不是会损耗不少资源呢?你再想想吧。
#22
楼上的各位的意见,已经很中肯了
如果你非想要干点什么,调整
session.gc_probability
session.gc_divisor
的值
其实你不管不顾就可以了,一管搞不好还管出事了,参考天朝的政策
如果你非想要干点什么,调整
session.gc_probability
session.gc_divisor
的值
其实你不管不顾就可以了,一管搞不好还管出事了,参考天朝的政策
#23
只有在下次session_start的时候才会有一定几率启动session gc.
如果一直没有访问,则gc永远不会自己启动
如果一直没有访问,则gc永远不会自己启动
#24
如果蓝屏了呢?
#25
每天回帖可以获得100分
#26
学习中,一直以为会话结束掉就会中止掉Session..不知道JAVA中的Session是怎么处理的~`
#27
要是用php的gc处理的话肯定访问量大的时候负荷就大,我是想自己手动消耗当前用户的session,就是当用户关闭浏览器后,然后得知浏览器关闭,这个时候就开始消耗当前session
#28
2楼正解,我用过。
只不过现在大家都喜欢用一个窗口多标签模式,在这里行不通,IE6里是100% OK~
只不过现在大家都喜欢用一个窗口多标签模式,在这里行不通,IE6里是100% OK~
#29
谢谢大家的意见,学了很多东西。。。。
#30
LZ可以这么做:
session超时设置为30秒
每个页面每30秒AJAX一个固定页面 延续Session 这样30次 15分钟超时
session超时设置为30秒
每个页面每30秒AJAX一个固定页面 延续Session 这样30次 15分钟超时
#31
都是强人
#32
2楼正解!
#33
“浏览器关闭”的瞬间,如果没有向服务器发送什么请求的话,C:\WINDOWS\Temp 下的 session 文件是不会被“凭空删除”的,毕竟 PHP 是“只有在 request 驱动下才能执行”的程序。
不过不用担心,一般来说,那个残留的垃圾 session 文件不会再被用到了,因为原来那个浏览器既然关闭了,别的浏览器窗口不能提供对应那个 session 的 cookie,所以,逻辑上讲,那个 session 的确是被“销毁”了。
至于那个垃圾文件本身,会在随后 request 发生的时候以某种几率被删除,而控制这个几率的配置参数,前面已经提到多次了。不过这个最好别惹它。
■□■□■□■□■□■□■□■
□ □
■ 忍以明志 勤以致远 ■
□ □
■□■□■□■□■□■□■□■
基于CSDN论坛提供的插件扩展功能,自己做了个签名档工具,分享给大家,欢迎技术交流 :)
#34
gc 的处理效果应该比自己手工处理好,它是按照一定的几率来启动处理,不是每次都处理,所以不怕“访问量大”的情况。而且它一旦启动,相当于做的是“批处理”,比自己单个处理效率应该好一点。
这且不说,其实最麻烦的问题(几乎是“不可能完成的任务”)是如何在“浏览器关闭”的时候通知服务器。
以前看到过对这个问题的专门讨论,基本结论是没有完美解决方案,退而求其次当然可以(比如不保证百分之百成功,例如浏览器崩溃退出的情形)。
■□■□■□■□■□■□■□■
□ □
■ 忍以明志 勤以致远 ■
□ □
■□■□■□■□■□■□■□■
基于CSDN论坛提供的插件扩展功能,自己做了个签名档工具,分享给大家,欢迎技术交流 :)
#35
$_Session=array();
session_destory();
session_destory();
#36
路过,学习下了......
#37
没事论坛里转转还是有收获的吗……
#38
学习 帮顶
#39
路过,学习了啊。
#40
是很强阿............
#41
注销个session都这么麻烦!学习中
#42
今天下午也是纠结于这个问题~~~
#1
window onunload事件中调用session_destroy();
#2
是自动销毁的
Garbage Collection process对过期session销毁,但是,并非一过期就销毁,换句话说,它是以一定的几率进行的。如果一过期就销毁,当访问量大的时候,销毁session势必会占用相当的资源
你可以看看php配置文件中
session.gc_probability = 1
session.gc_divisor = 1000
这两个参数的意思千分之一的几率启动GC
Garbage Collection process对过期session销毁,但是,并非一过期就销毁,换句话说,它是以一定的几率进行的。如果一过期就销毁,当访问量大的时候,销毁session势必会占用相当的资源
你可以看看php配置文件中
session.gc_probability = 1
session.gc_divisor = 1000
这两个参数的意思千分之一的几率启动GC
#3
这个写在 body 里面?? 销毁的太快了。。。。。
#4
自动销毁大概多长时间??还是按临时文件夹超过多少自动销毁??
#5
写在body里面不大好,这就意味着每个页面都得写上。。。
#6
那应该怎么个写法,我也感觉有些复杂。。。。
#7
所有浏览器关闭,才会销毁..
应该是这样的..ff浏览器?
应该是这样的..ff浏览器?
#8
ie 和 FF 都测试了,看了C:\WINDOWS\Temp 没有销毁session
#9
session是存在于服务器的,当你关闭浏览器的时候就代表一次会话结束.
#10
对,会话是结束了,但是服务器上的session并没有被销毁
#11
php完全做到,不行!!!!
asp,.net还可以
asp,.net还可以
#12
#2楼说的很清楚了.
是以一定几率进行GC,默认情况下每次请求以1/100的几率进行SESSION GC,换句话说,请求100次就有可能命中一次session gc.也就是说session虽然过期了,但不一定会立即被删除.session数据存于文件是一般这么设置的,你想想,一旦你的用户量上来了,你设置100/100的几率删除session,那么每发一次请求,就处理一次session gc,这个势必增加了一些不必要的i/o损耗.
而且会话是否结束,不应该仅凭关闭浏览器视为会话的结束,拿session use cookie来说,这要看cookie的失效设置是否设置了关闭浏览器,cookie即过期.即php.ini的session.cookie_lifetime是否设置为0.否则的话,cookie在有效期内,即使是关闭浏览器再重新打开,请求头内一样保留之前的session id,这时候发送请求给服务器,只要相应的session文件被删除,会话仍然会继续.
是以一定几率进行GC,默认情况下每次请求以1/100的几率进行SESSION GC,换句话说,请求100次就有可能命中一次session gc.也就是说session虽然过期了,但不一定会立即被删除.session数据存于文件是一般这么设置的,你想想,一旦你的用户量上来了,你设置100/100的几率删除session,那么每发一次请求,就处理一次session gc,这个势必增加了一些不必要的i/o损耗.
而且会话是否结束,不应该仅凭关闭浏览器视为会话的结束,拿session use cookie来说,这要看cookie的失效设置是否设置了关闭浏览器,cookie即过期.即php.ini的session.cookie_lifetime是否设置为0.否则的话,cookie在有效期内,即使是关闭浏览器再重新打开,请求头内一样保留之前的session id,这时候发送请求给服务器,只要相应的session文件被删除,会话仍然会继续.
#13
一直以为是浏览器关闭了就会删除session, 现在看来貌似不是这样的。
学习2楼和12楼。
学习2楼和12楼。
#14
手误了
..只要相应的session文件 未被删除,会话仍然会继续.
#15
是个解决办法~~~但是如果访问量比较大的话~这种方式服务器可能会吃不消
#16
我这有个折中的办法~~就是你在服务器后台跑个脚本~~定期扫描用户session文件,超过多长时间没改变的直接删除,前提是你在前端页面做个隐藏的ajax(目的是保持session文件的更改时间最新),这样相当于你手写完成了php的一部分session处理机制!
#17
不用去,会自动垃圾回收
#18
不错,学习了
#19
是个头痛问题,在网上找了好几天,都没找到解决办法。。。。。希望大家有好的解绝办法。。。
#20
////销毁session////
function sessionDestroy() {
session_destroy();
setcookie(session_name(),'',time()-3600);
$_SESSION = array();
}
function sessionDestroy() {
session_destroy();
setcookie(session_name(),'',time()-3600);
$_SESSION = array();
}
#21
如果是session use cookie,使用file存储,一般就保留默认配置值,服务器以1/100的几率处理过期session,没必要每次请求都进行session gc处理.
如果自己处理,你要删除过期session,总得遍历session保存目录的所有的session文件吧?你想想用户量如果很大,每个用户登录浏览服务器的页面,就会生成session文件,那得多少份session文件,然后遍历每个session文件,判断文件上次访问时间离当前时间是否超出了session_maxlife设置的时间,超过即删除。你如果用php去做这个工作,效率上不是更慢了吗!?你还不如设置php.ini的session.gc_probability = 100和session.gc_divisor = 100呢,但是一般不需要服务器接收每次http请求都处理session gc就是因为效率资源上的考量。几十万的访问量,每次请求都进行文件读删,这是不是会损耗不少资源呢?你再想想吧。
#22
楼上的各位的意见,已经很中肯了
如果你非想要干点什么,调整
session.gc_probability
session.gc_divisor
的值
其实你不管不顾就可以了,一管搞不好还管出事了,参考天朝的政策
如果你非想要干点什么,调整
session.gc_probability
session.gc_divisor
的值
其实你不管不顾就可以了,一管搞不好还管出事了,参考天朝的政策
#23
只有在下次session_start的时候才会有一定几率启动session gc.
如果一直没有访问,则gc永远不会自己启动
如果一直没有访问,则gc永远不会自己启动
#24
如果蓝屏了呢?
#25
每天回帖可以获得100分
#26
学习中,一直以为会话结束掉就会中止掉Session..不知道JAVA中的Session是怎么处理的~`
#27
要是用php的gc处理的话肯定访问量大的时候负荷就大,我是想自己手动消耗当前用户的session,就是当用户关闭浏览器后,然后得知浏览器关闭,这个时候就开始消耗当前session
#28
2楼正解,我用过。
只不过现在大家都喜欢用一个窗口多标签模式,在这里行不通,IE6里是100% OK~
只不过现在大家都喜欢用一个窗口多标签模式,在这里行不通,IE6里是100% OK~
#29
谢谢大家的意见,学了很多东西。。。。
#30
LZ可以这么做:
session超时设置为30秒
每个页面每30秒AJAX一个固定页面 延续Session 这样30次 15分钟超时
session超时设置为30秒
每个页面每30秒AJAX一个固定页面 延续Session 这样30次 15分钟超时
#31
都是强人
#32
2楼正解!
#33
“浏览器关闭”的瞬间,如果没有向服务器发送什么请求的话,C:\WINDOWS\Temp 下的 session 文件是不会被“凭空删除”的,毕竟 PHP 是“只有在 request 驱动下才能执行”的程序。
不过不用担心,一般来说,那个残留的垃圾 session 文件不会再被用到了,因为原来那个浏览器既然关闭了,别的浏览器窗口不能提供对应那个 session 的 cookie,所以,逻辑上讲,那个 session 的确是被“销毁”了。
至于那个垃圾文件本身,会在随后 request 发生的时候以某种几率被删除,而控制这个几率的配置参数,前面已经提到多次了。不过这个最好别惹它。
■□■□■□■□■□■□■□■
□ □
■ 忍以明志 勤以致远 ■
□ □
■□■□■□■□■□■□■□■
基于CSDN论坛提供的插件扩展功能,自己做了个签名档工具,分享给大家,欢迎技术交流 :)
#34
gc 的处理效果应该比自己手工处理好,它是按照一定的几率来启动处理,不是每次都处理,所以不怕“访问量大”的情况。而且它一旦启动,相当于做的是“批处理”,比自己单个处理效率应该好一点。
这且不说,其实最麻烦的问题(几乎是“不可能完成的任务”)是如何在“浏览器关闭”的时候通知服务器。
以前看到过对这个问题的专门讨论,基本结论是没有完美解决方案,退而求其次当然可以(比如不保证百分之百成功,例如浏览器崩溃退出的情形)。
■□■□■□■□■□■□■□■
□ □
■ 忍以明志 勤以致远 ■
□ □
■□■□■□■□■□■□■□■
基于CSDN论坛提供的插件扩展功能,自己做了个签名档工具,分享给大家,欢迎技术交流 :)
#35
$_Session=array();
session_destory();
session_destory();
#36
路过,学习下了......
#37
没事论坛里转转还是有收获的吗……
#38
学习 帮顶
#39
路过,学习了啊。
#40
是很强阿............
#41
注销个session都这么麻烦!学习中
#42
今天下午也是纠结于这个问题~~~