当前位置: 首页 > 后端技术 > PHP

PHP的session垃圾回收机制

时间:2023-03-29 15:34:14 PHP

在PHP中,当没有变量指向这个对象时,这个对象就变成了垃圾。PHP会在内存中销毁它;这是PHP的GC垃圾处理机制,防止内存溢出。GC的工作就是扫描所有的session信息,将当前时间减去session的最后修改时间,与session.gc_maxlifetime参数进行比较。如果存活时间超过gc_maxlifetime(默认24分钟),session将被删除。当出现有效请求时,PHP会根据全局变量session.gc_probability和session.gc_divisor的值决定是否开启GC。默认情况下,session.gc_probability=1session.gc_divisor=100表示有1%的可能性开始GC(也就是说100次请求中只有1次gc会以100次请求中的一次开始)。但是,如果你的web服务器有多个站点,当多个站点时,GC可能会处理session出现意想不到的结果,原因是:GC在工作时,不区分不同站点的session。那么这个时候怎么解决呢?修改session.save_path,或者使用session_save_path()将各个站点的session保存到专门的目录;提高GC启动率,当GC启动率增加时,系统性能会相应下降,不推荐;代码中判断使用session_destroy()删除当前session的生命周期;session.gc_probability=1session.gc_divisor=100session.gc_maxlifetime=1440这三个配置的组合构建了服务器会话的垃圾收集机制。session.gc_probability和session.gc_divisor构成了sessioncleaningProbability的实现,理论解释是服务器定时调用gc函数以一定的概率清理session。清理的概率为:gc_probability/gc_divisor例如:1/100表示??每次初始化新的session时,有1%的概率会启动垃圾回收程序,清理标准为session定义的时间。gc_maxlifetime。session.gc_divisor和session.gc_probability共同定义了每次会话初始化时启动gc(garbagecollection垃圾回收)进程的概率。这个概率是使用gc_probability/gc_divisor计算的。例如,1/100表示有1%的概率在每个请求上启动gc进程。session.gc_divisor默认为100。例如:session.gc_maxlifetime=60session.gc_divisor=1000session.gc_probability=1表示当每千个用户调用session_start()时,将100%执行垃圾回收机制,删除无用的会话文件磁盘。注意:一般对于一些大型门户网站,建议增加session.gc_divisor以减少开销。接下来我将通过一个例子来演示如何配置调用gc(垃圾回收)进程!通过配置php.ini文件,修改如下信息:session.gc_maxlifetime=60//如果session文件在60s后还没有被访问,session文件将被视为“垃圾文件”,等待gc(垃圾回收)进程清理session.gc_probability=1000因为gc进程被调用的概率是通过gc_probability/gc_divisor计算的,这里我把session.gc_probability改成1000,session.gc_divisor默认也是1000。那么每次gc进程都会被调用session_start()函数执行的时间。打开三个会话并创建三个相应的会话文件。如果每个文件在60秒内没有被调用,它将被视为“垃圾文件”。当gc进程调用它的时候,“垃圾文件”会被unlink,因为我之前通过修改php.ini配置文件,把gc被调用的概率改成了100%,所以接下来,如果我再用任何浏览器刷新下一页,三个会话文件,应该只剩下一个。session.save_handler=files默认为file,它定义了session在服务器端的保存方式。file表示将会话保存在临时文件中。如果我们要自定义其他保存方式(比如使用数据库),需要将此项设置为user;