在PHP中,没有任何变量指向这个对象时,这个对象就成为垃圾。PHP会将其在内存中销毁,这是PHP的GC垃圾处理机制,防止内存溢出。
实例
session.gc_probability = 1 //概率
session.gc_divisor = 1000 //除数
session.gc_maxlifetime = 86400 //session文件的有效期,单位s
这三个配置组合构建服务端session的垃圾回收机制。
当用户登录时,session_start()会在服务器上产生一个session文件,并把这个文件的有效期设置成86400(即24小时),这些文件会占用服务器磁盘空间,所以服务器会定期清理,那么多久清理一次呢? session.gc_probability / session.gc_divisor = 1/1000 即每1000次登录(即调用session_start()),就会执行1次垃圾清理,将磁盘上没用的session文件删除。
session.gc_maxlifetime的值的作用
GC的工作就是扫描所有的session文件信息,用当前时间减去session最后修改的时间,同session.gc_maxlifetime参数进行比较,如果生存时间超过gc_maxlifetime(默认24分钟),就将该session删除。
session.gc_probability和session.gc_divisor的值的作用
总的来说,session.gc_probability与session.gc_divisor构成了执行session清理的概率。
当一个有效的请求发生时,PHP会根据全局变量 session.gc_probability和session.gc_divisor的值,来决定是否启用一个GC, 在默认情况下,session.gc_probability=1, session.gc_divisor =100也就是说有1%的可能性启动GC(也就是说100个请求中只有一个gc会伴随着这100个中的某个请求而启动)。
扩展阅读
不管是关闭网页也好,关闭浏览器也罢,甚至把浏览器删掉重装了,都不会影响到已经生成的 session。
一言以蔽之,所有浏览器行为都不会导致 session 被自动销毁。
用户关闭浏览器再开,因为 cookie 失效他会获得一个新的 session。
但这并不代表他原来的 session 就被销毁了,那个 session 依然在服务器上存在。
如果在浏览器上手动把名字等于 session.name 的那个 cookie 的值改回之前的 session_id(),还是可以重新获得之前的那个 session 的。
参考:https://segmentfault.com/q/1010000000191102 (一楼回答)