解读PHP中的垃圾收集机制
The PHP language, like other languages, has a garbage collection mechanism.So what we're going to explain to you today is about the PHP garbage collection mechanism.I hope to help you.PHP strtotime PHP (memory_get_usage) application wise remark of an experienced person to manage the memory of PHP unset using unset PHP global variables detailedexplanation () function to destroy the variables to teach you quickly realize PHP authentication, a total of PHP garbage collection mechanism (Garbage Collector GC) in PHP, there is no variable pointing to this object, the object becomes garbage.PHP will destroy it in memory; this is the PHP's GC garbage disposal mechanism to prevent memory overflow.When an PHP thread ends, all of the memory space thaT是目前占据将被破坏,而在当前程序中所有的对象都是破坏simultaneously.gc过程通常遵循每个会话开始with.gc。其目的是在会话文件过时后自动销毁这些文件。二,__destruct /复原__destruct()析构函数执行垃圾回收时的对象。
取消破坏变量指向的对象,而不是对象。三、会话和PHP的垃圾收集机制由于PHP的工作机制,它没有固定的守护线程扫描会话的信息,决定是否失败,当一个有效的请求时,PHP将基于全局变量session.gc_probability和session.gc_divisor值,以确定是否启用会话GC。gc_probability = 1默认session.gc_divisor = 100的情况下,也就是说有1%的机会开始GC(即要求只在一个GC 100请求将伴随着100开始)。PHP的垃圾收集机制是与当前时间减去SE所有会话信息扫描与上次修改时间,与session.gc_maxlifetime参数相比,如果存活时间超过gc_maxlifetime(默认24分钟),会话将被删除。
但是,如果Web服务器上有多个站点和多个站点,则在处理会话时,GC可能会导致意外的结果。原因是GC不区分会话。从不同的网站工作,那么如何解决这个问题呢
1。修改session.save_path,或使用session_save_path()来保存每个网站的会话到私有目录,
2。提供GC的启动速率,自然地提高PHP垃圾收集机制的启动速度,降低系统性能,不推荐使用。
三.在代码来确定当前会话的生命时间,用session_destroy()删除。
参考计数基本知识
每个PHP变量称为变量变容器。一种容器类型的变量的变量,除了包含变量和值,额外的信息还包含两个字节。第一个是is_ref
当一个变量被赋值为一个恒定值,产生一个变量变量的容器,如下面所示:
< PHP
$ 新字符串;
>
在这种情况下,新变量是A,是在当前范围内生成的。类型是字符串和变量容器新字符串的值,并生成两个字节。额外的信息,is_ref默认设置为false,因为参考是不产生任何自定义的引用计数。设置为1,因为这里只有一个变量,使用变量容器。叫Xdebug检查变量的内容:
< PHP
$ 新字符串;
xdebug_debug_zval(A);
>
上述代码将输出:
答:(引用计数为1,is_ref = 0)=新字符串
向变量a添加引用计数
< PHP
$ 新字符串;
美元=美元;
xdebug_debug_zval(A);
>
上述代码将输出:
答:(引用计数为2,is_ref = 0)=新字符串
此时,引用的数量是2,因为相同的变量容器是可变的A和变量B。0可变容器是一个引用计数毁灭。当任何一个变量的连接变离开它的范围(例如:函数执行结束),或致电unset函数(变量),引用计数将减少1,下面的例子:
< PHP
$ 新字符串;
$ =;
xdebug_debug_zval(A);
unset($,$ C);
xdebug_debug_zval(A);
>
上述代码将输出:
答:(引用计数为3,is_ref = 0)=新string'a:(引用计数为1,is_ref = 0)=新字符串
如果我们现在执行unset(美元),该容器包含类型和美元价值将从内存中删除
复合类型(复合类型)
在考虑数组和对象等复杂类型时,会比较复杂。使用类型(标量)、数组和对象变量的标量值到现有成员或属性本身的符号表。这意味着下面的例子将产生三个变量变容器
< PHP
美元=阵列('meaning ' = '生命',若干= 42);
xdebug_debug_zval(A);
>
上述代码输出:
答:(引用计数为1,is_ref = 0)=阵列('meaning=(引用计数为1,is_ref = 0)=人生,若干=(引用计数= 1,is_ref = 0)= 42)
三变量变量的容器是一个意思,规则数。增加和减少引用计数如上所述
作为一个特殊的情况,将数组本身添加为数组元素:
< PHP
美元=阵列(话);
$;
xdebug_debug_zval(A);
>
上述代码输出的结果:
答:(引用计数为2,is_ref = 1)(= array = 0(引用计数= 1,is_ref = 0)=1,(引用计数= 2,is_ref = 1)= > =…)
你可以看到,数组和数组本身元素的{ 1 }点变容器的引用计数是2
当设置功能称为数组的一个变化,美元1引用计数,并发生内存泄漏。
变量容器的清理问题
虽然这个结构的范围没有任何标志(也就是因为数组变量容器的元素)1 仍然指向数组本身,所以这个容器不能被消除。由于没有其他标志指向它,用户无法移除该结构,结果将导致内存泄漏。幸运的是,PHP将在请求结束时清除数据结构,但PHP的删除将消耗大量内存空间。
恢复周期
5.3.0php采用一种新的同步周期的恢复算法来解决上面提到的内存泄漏问题
首先,我们必须制定一些基本规则:
如果引用计数增加,它将继续使用,当然,它不再在垃圾中。如果引用技术被降为零,变量容器将被删除(免费)。也就是说,只有在引用计数减少到一个非零值,将产生的废弃物(垃圾循环周期)。然后,在循环中的一个垃圾中,通过检查引用计数减少1,以及变量容器为零的检查引用数,找出哪个部分是垃圾。
为了避免检查所有垃圾循环引用计数可能会减少,这一算法的所有可能的根(可能是一根zval变量,容器)在根缓冲区(根缓冲)在(标有紫色),它可以确保每一个可能的垃圾根(可能的垃圾根)在缓冲区中只有一个全。只有在根缓冲区中,所有不同的变量容器中的缓冲区才能执行垃圾收集操作。