看教程什么的 都说 浏览器关闭后session自动销毁,但是我在本地测试,发现程序关闭后session不能自动销毁,另外php.ini 默认是20分钟后session自动销毁,也没反应,希望懂得的出来解释
Garbage Collection process对过期session销毁,但是,并非一过期就销毁,换句话说,它是以一定的几率进行的。如果一过期就销毁,当访问量大的时候,销毁session势必会占用相当的资源
自动销毁大概多长时间??还是按临时文件夹超过多少自动销毁??
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文件被删除,会话仍然会继续.
是个解决办法~~~但是如果访问量比较大的话~这种方式服务器可能会吃不消
我这有个折中的办法~~就是你在服务器后台跑个脚本~~定期扫描用户session文件,超过多长时间没改变的直接删除,前提是你在前端页面做个隐藏的ajax(目的是保持session文件的更改时间最新),这样相当于你手写完成了php的一部分session处理机制!
是个头痛问题,在网上找了好几天,都没找到解决办法。。。。。希望大家有好的解绝办法。。。
如果是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就是因为效率资源上的考量。几十万的访问量,每次请求都进行文件读删,这是不是会损耗不少资源呢?你再想想吧。
只有在下次session_start的时候才会有一定几率启动session gc.
如果一直没有访问,则gc永远不会自己启动
学习中,一直以为会话结束掉就会中止掉Session..不知道JAVA中的Session是怎么处理的~`
要是用php的gc处理的话肯定访问量大的时候负荷就大,我是想自己手动消耗当前用户的session,就是当用户关闭浏览器后,然后得知浏览器关闭,这个时候就开始消耗当前session
浏览器关闭”的瞬间,如果没有向服务器发送什么请求的话,C:/WINDOWS/Temp 下的 session 文件是不会被“凭空删除”的,毕竟 PHP 是“只有在 request 驱动下才能执行”的程序。
不过不用担心,一般来说,那个残留的垃圾 session 文件不会再被用到了,因为原来那个浏览器既然关闭了,别的浏览器窗口不能提供对应那个 session 的 cookie,所以,逻辑上讲,那个 session 的确是被“销毁”了。
至于那个垃圾文件本身,会在随后 request 发生的时候以某种几率被删除,而控制这个几率的配置参数,前面已经提到多次了。不过这个最好别惹它。
gc 的处理效果应该比自己手工处理好,它是按照一定的几率来启动处理,不是每次都处理,所以不怕“访问量大”的情况。而且它一旦启动,相当于做的是“批处理”,比自己单个处理效率应该好一点。
这且不说,其实最麻烦的问题(几乎是“不可能完成的任务”)是如何在“浏览器关闭”的时候通知服务器。
以前看到过对这个问题的专门讨论,基本结论是没有完美解决方案,退而求其次当然可以(比如不保证百分之百成功,例如浏览器崩溃退出的情形)。
来源:英超直播