php 关闭浏览器,销毁session 大家是怎么做的

时间:2021-08-13 13:16:54
如题

有详细代码更好 

 看教程什么的 都说 浏览器关闭后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

#3


这个写在  body  里面??  销毁的太快了。。。。。

#4


自动销毁大概多长时间??还是按临时文件夹超过多少自动销毁??

#5


写在body里面不大好,这就意味着每个页面都得写上。。。

#6


那应该怎么个写法,我也感觉有些复杂。。。。

#7


所有浏览器关闭,才会销毁..
应该是这样的..ff浏览器?

#8


ie 和 FF 都测试了,看了C:\WINDOWS\Temp    没有销毁session

#9


session是存在于服务器的,当你关闭浏览器的时候就代表一次会话结束.

#10


对,会话是结束了,但是服务器上的session并没有被销毁

#11


php完全做到,不行!!!!
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文件被删除,会话仍然会继续.

#13


一直以为是浏览器关闭了就会删除session, 现在看来貌似不是这样的。
学习2楼和12楼。

#14


引用 12 楼 foolbirdflyfirst 的回复:
#2楼说的很清楚了.

是以一定几率进行GC,默认情况下每次请求以1/100的几率进行SESSION GC,换句话说,请求100次就有可能命中一次session gc.也就是说session虽然过期了,但不一定会立即被删除.session数据存于文件是一般这么设置的,你想想,一旦你的用户量上来了,你设置100/100的几率删除session,那么每发一次请求,就处理一次session gc,……

手误了
..只要相应的session文件 被删除,会话仍然会继续.

#15


引用 14 楼 boojs 的回复:
引用 12 楼 foolbirdflyfirst 的回复:

#2楼说的很清楚了.

是以一定几率进行GC,默认情况下每次请求以1/100的几率进行SESSION GC,换句话说,请求100次就有可能命中一次session gc.也就是说session虽然过期了,但不一定会立即被删除.session数据存于文件是一般这么设置的,你想想,一旦你的用户量上来了,你设置100/100的几率删除……



是个解决办法~~~但是如果访问量比较大的话~这种方式服务器可能会吃不消

#16


我这有个折中的办法~~就是你在服务器后台跑个脚本~~定期扫描用户session文件,超过多长时间没改变的直接删除,前提是你在前端页面做个隐藏的ajax(目的是保持session文件的更改时间最新),这样相当于你手写完成了php的一部分session处理机制!

#17


不用去,会自动垃圾回收

#18


不错,学习了

#19


是个头痛问题,在网上找了好几天,都没找到解决办法。。。。。希望大家有好的解绝办法。。。

#20


////销毁session////
function sessionDestroy() {
    session_destroy();
    setcookie(session_name(),'',time()-3600);
    $_SESSION = array();
}

#21


引用 19 楼 gogo198 的回复:
是个头痛问题,在网上找了好几天,都没找到解决办法。。。。。希望大家有好的解绝办法。。。

如果是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
的值

其实你不管不顾就可以了,一管搞不好还管出事了,参考天朝的政策

#23


只有在下次session_start的时候才会有一定几率启动session gc.

如果一直没有访问,则gc永远不会自己启动

#24


如果蓝屏了呢?

#25


每天回帖可以获得100分

#26


学习中,一直以为会话结束掉就会中止掉Session..不知道JAVA中的Session是怎么处理的~`

#27


要是用php的gc处理的话肯定访问量大的时候负荷就大,我是想自己手动消耗当前用户的session,就是当用户关闭浏览器后,然后得知浏览器关闭,这个时候就开始消耗当前session

#28


2楼正解,我用过。
只不过现在大家都喜欢用一个窗口多标签模式,在这里行不通,IE6里是100% OK~

#29


谢谢大家的意见,学了很多东西。。。。

#30


LZ可以这么做:
session超时设置为30秒
每个页面每30秒AJAX一个固定页面 延续Session 这样30次 15分钟超时 

#31


都是强人

#32


2楼正解!

#33


引用楼主 gogo198 的回复:
看教程什么的 都说 浏览器关闭后session自动销毁,但是我在本地测试,发现程序关闭后session不能自动销毁,另外php.ini 默认是20分钟后session自动销毁,也没反应,希望懂得的出来解释

“浏览器关闭”的瞬间,如果没有向服务器发送什么请求的话,C:\WINDOWS\Temp 下的 session 文件是不会被“凭空删除”的,毕竟 PHP 是“只有在 request 驱动下才能执行”的程序。

不过不用担心,一般来说,那个残留的垃圾 session 文件不会再被用到了,因为原来那个浏览器既然关闭了,别的浏览器窗口不能提供对应那个 session 的 cookie,所以,逻辑上讲,那个 session 的确是被“销毁”了。

至于那个垃圾文件本身,会在随后 request 发生的时候以某种几率被删除,而控制这个几率的配置参数,前面已经提到多次了。不过这个最好别惹它。


■□■□■□■□■□■□■□■
□             □
■  忍以明志 勤以致远  ■
□             □
■□■□■□■□■□■□■□■
基于CSDN论坛提供的插件扩展功能,自己做了个签名档工具,分享给大家,欢迎技术交流 :)

#34


引用 27 楼 gogo198 的回复:
要是用php的gc处理的话肯定访问量大的时候负荷就大,我是想自己手动消耗当前用户的session,就是当用户关闭浏览器后,然后得知浏览器关闭,这个时候就开始消耗当前session

gc 的处理效果应该比自己手工处理好,它是按照一定的几率来启动处理,不是每次都处理,所以不怕“访问量大”的情况。而且它一旦启动,相当于做的是“批处理”,比自己单个处理效率应该好一点。

这且不说,其实最麻烦的问题(几乎是“不可能完成的任务”)是如何在“浏览器关闭”的时候通知服务器。

以前看到过对这个问题的专门讨论,基本结论是没有完美解决方案,退而求其次当然可以(比如不保证百分之百成功,例如浏览器崩溃退出的情形)。

■□■□■□■□■□■□■□■
□             □
■  忍以明志 勤以致远  ■
□             □
■□■□■□■□■□■□■□■
基于CSDN论坛提供的插件扩展功能,自己做了个签名档工具,分享给大家,欢迎技术交流 :)

#35


$_Session=array();
session_destory();

#36


路过,学习下了...... php 关闭浏览器,销毁session 大家是怎么做的

#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

#3


这个写在  body  里面??  销毁的太快了。。。。。

#4


自动销毁大概多长时间??还是按临时文件夹超过多少自动销毁??

#5


写在body里面不大好,这就意味着每个页面都得写上。。。

#6


那应该怎么个写法,我也感觉有些复杂。。。。

#7


所有浏览器关闭,才会销毁..
应该是这样的..ff浏览器?

#8


ie 和 FF 都测试了,看了C:\WINDOWS\Temp    没有销毁session

#9


session是存在于服务器的,当你关闭浏览器的时候就代表一次会话结束.

#10


对,会话是结束了,但是服务器上的session并没有被销毁

#11


php完全做到,不行!!!!
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文件被删除,会话仍然会继续.

#13


一直以为是浏览器关闭了就会删除session, 现在看来貌似不是这样的。
学习2楼和12楼。

#14


引用 12 楼 foolbirdflyfirst 的回复:
#2楼说的很清楚了.

是以一定几率进行GC,默认情况下每次请求以1/100的几率进行SESSION GC,换句话说,请求100次就有可能命中一次session gc.也就是说session虽然过期了,但不一定会立即被删除.session数据存于文件是一般这么设置的,你想想,一旦你的用户量上来了,你设置100/100的几率删除session,那么每发一次请求,就处理一次session gc,……

手误了
..只要相应的session文件 被删除,会话仍然会继续.

#15


引用 14 楼 boojs 的回复:
引用 12 楼 foolbirdflyfirst 的回复:

#2楼说的很清楚了.

是以一定几率进行GC,默认情况下每次请求以1/100的几率进行SESSION GC,换句话说,请求100次就有可能命中一次session gc.也就是说session虽然过期了,但不一定会立即被删除.session数据存于文件是一般这么设置的,你想想,一旦你的用户量上来了,你设置100/100的几率删除……



是个解决办法~~~但是如果访问量比较大的话~这种方式服务器可能会吃不消

#16


我这有个折中的办法~~就是你在服务器后台跑个脚本~~定期扫描用户session文件,超过多长时间没改变的直接删除,前提是你在前端页面做个隐藏的ajax(目的是保持session文件的更改时间最新),这样相当于你手写完成了php的一部分session处理机制!

#17


不用去,会自动垃圾回收

#18


不错,学习了

#19


是个头痛问题,在网上找了好几天,都没找到解决办法。。。。。希望大家有好的解绝办法。。。

#20


////销毁session////
function sessionDestroy() {
    session_destroy();
    setcookie(session_name(),'',time()-3600);
    $_SESSION = array();
}

#21


引用 19 楼 gogo198 的回复:
是个头痛问题,在网上找了好几天,都没找到解决办法。。。。。希望大家有好的解绝办法。。。

如果是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
的值

其实你不管不顾就可以了,一管搞不好还管出事了,参考天朝的政策

#23


只有在下次session_start的时候才会有一定几率启动session gc.

如果一直没有访问,则gc永远不会自己启动

#24


如果蓝屏了呢?

#25


每天回帖可以获得100分

#26


学习中,一直以为会话结束掉就会中止掉Session..不知道JAVA中的Session是怎么处理的~`

#27


要是用php的gc处理的话肯定访问量大的时候负荷就大,我是想自己手动消耗当前用户的session,就是当用户关闭浏览器后,然后得知浏览器关闭,这个时候就开始消耗当前session

#28


2楼正解,我用过。
只不过现在大家都喜欢用一个窗口多标签模式,在这里行不通,IE6里是100% OK~

#29


谢谢大家的意见,学了很多东西。。。。

#30


LZ可以这么做:
session超时设置为30秒
每个页面每30秒AJAX一个固定页面 延续Session 这样30次 15分钟超时 

#31


都是强人

#32


2楼正解!

#33


引用楼主 gogo198 的回复:
看教程什么的 都说 浏览器关闭后session自动销毁,但是我在本地测试,发现程序关闭后session不能自动销毁,另外php.ini 默认是20分钟后session自动销毁,也没反应,希望懂得的出来解释

“浏览器关闭”的瞬间,如果没有向服务器发送什么请求的话,C:\WINDOWS\Temp 下的 session 文件是不会被“凭空删除”的,毕竟 PHP 是“只有在 request 驱动下才能执行”的程序。

不过不用担心,一般来说,那个残留的垃圾 session 文件不会再被用到了,因为原来那个浏览器既然关闭了,别的浏览器窗口不能提供对应那个 session 的 cookie,所以,逻辑上讲,那个 session 的确是被“销毁”了。

至于那个垃圾文件本身,会在随后 request 发生的时候以某种几率被删除,而控制这个几率的配置参数,前面已经提到多次了。不过这个最好别惹它。


■□■□■□■□■□■□■□■
□             □
■  忍以明志 勤以致远  ■
□             □
■□■□■□■□■□■□■□■
基于CSDN论坛提供的插件扩展功能,自己做了个签名档工具,分享给大家,欢迎技术交流 :)

#34


引用 27 楼 gogo198 的回复:
要是用php的gc处理的话肯定访问量大的时候负荷就大,我是想自己手动消耗当前用户的session,就是当用户关闭浏览器后,然后得知浏览器关闭,这个时候就开始消耗当前session

gc 的处理效果应该比自己手工处理好,它是按照一定的几率来启动处理,不是每次都处理,所以不怕“访问量大”的情况。而且它一旦启动,相当于做的是“批处理”,比自己单个处理效率应该好一点。

这且不说,其实最麻烦的问题(几乎是“不可能完成的任务”)是如何在“浏览器关闭”的时候通知服务器。

以前看到过对这个问题的专门讨论,基本结论是没有完美解决方案,退而求其次当然可以(比如不保证百分之百成功,例如浏览器崩溃退出的情形)。

■□■□■□■□■□■□■□■
□             □
■  忍以明志 勤以致远  ■
□             □
■□■□■□■□■□■□■□■
基于CSDN论坛提供的插件扩展功能,自己做了个签名档工具,分享给大家,欢迎技术交流 :)

#35


$_Session=array();
session_destory();

#36


路过,学习下了...... php 关闭浏览器,销毁session 大家是怎么做的

#37


没事论坛里转转还是有收获的吗……

#38


学习 帮顶

#39


路过,学习了啊。

#40


是很强阿............

#41


注销个session都这么麻烦!学习中

#42



  今天下午也是纠结于这个问题~~~