如题有详细代码更好  看教程什么的 都说 浏览器关闭后session自动销毁,但是我在本地测试,发现程序关闭后session不能自动销毁,另外php.ini 默认是20分钟后session自动销毁,也没反应,希望懂得的出来解释 

解决方案 »

  1.   

    window onunload事件中调用session_destroy();
      

  2.   

    是自动销毁的Garbage Collection process对过期session销毁,但是,并非一过期就销毁,换句话说,它是以一定的几率进行的。如果一过期就销毁,当访问量大的时候,销毁session势必会占用相当的资源你可以看看php配置文件中
    session.gc_probability = 1
    session.gc_divisor = 1000
    这两个参数的意思千分之一的几率启动GC
      

  3.   

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

  4.   

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

  5.   

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

  6.   

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

  7.   

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

  8.   

    php完全做到,不行!!!!
    asp,.net还可以
      

  9.   

    #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文件被删除,会话仍然会继续.
      

  10.   

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

  11.   

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

  12.   

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

  13.   

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

  14.   

    如果是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就是因为效率资源上的考量。几十万的访问量,每次请求都进行文件读删,这是不是会损耗不少资源呢?你再想想吧。
      

  15.   

    楼上的各位的意见,已经很中肯了如果你非想要干点什么,调整
    session.gc_probability
    session.gc_divisor
    的值其实你不管不顾就可以了,一管搞不好还管出事了,参考天朝的政策
      

  16.   

    只有在下次session_start的时候才会有一定几率启动session gc.如果一直没有访问,则gc永远不会自己启动
      

  17.   

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

  18.   

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

  19.   

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

  20.   

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

  21.   

    “浏览器关闭”的瞬间,如果没有向服务器发送什么请求的话,C:\WINDOWS\Temp 下的 session 文件是不会被“凭空删除”的,毕竟 PHP 是“只有在 request 驱动下才能执行”的程序。不过不用担心,一般来说,那个残留的垃圾 session 文件不会再被用到了,因为原来那个浏览器既然关闭了,别的浏览器窗口不能提供对应那个 session 的 cookie,所以,逻辑上讲,那个 session 的确是被“销毁”了。至于那个垃圾文件本身,会在随后 request 发生的时候以某种几率被删除,而控制这个几率的配置参数,前面已经提到多次了。不过这个最好别惹它。
    ■□■□■□■□■□■□■□■
    □             □
    ■  忍以明志 勤以致远  ■
    □             □
    ■□■□■□■□■□■□■□■
    基于CSDN论坛提供的插件扩展功能,自己做了个签名档工具,分享给大家,欢迎技术交流 :)
      

  22.   

    gc 的处理效果应该比自己手工处理好,它是按照一定的几率来启动处理,不是每次都处理,所以不怕“访问量大”的情况。而且它一旦启动,相当于做的是“批处理”,比自己单个处理效率应该好一点。这且不说,其实最麻烦的问题(几乎是“不可能完成的任务”)是如何在“浏览器关闭”的时候通知服务器。以前看到过对这个问题的专门讨论,基本结论是没有完美解决方案,退而求其次当然可以(比如不保证百分之百成功,例如浏览器崩溃退出的情形)。■□■□■□■□■□■□■□■
    □             □
    ■  忍以明志 勤以致远  ■
    □             □
    ■□■□■□■□■□■□■□■
    基于CSDN论坛提供的插件扩展功能,自己做了个签名档工具,分享给大家,欢迎技术交流 :)
      

  23.   

    $_Session=array();
    session_destory();
      

  24.   

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