PHP生命周期
php总共三个模块:内核、zend引擎、以及扩展层
php生命周期有五个阶段:
1、模块初始化阶段
2、请求初始化阶段
3、脚本执行阶段
4、请求关闭阶段
5、模块关闭阶段
PHP垃圾回收机制
在php中变量占用的空间,是不需要我们手动回收的,它会自动释放程序不再需要的已分配的内存块,这就是PHP垃圾回收机制(GC机制)。
在理解GC之前,先了解下php的变量在底层的实现,php中变量存在于一个zval的变量容器中,结构:变量名、值、is_ref、refcount。
is_ref:是个bool值,用来区分变量是否属于引用集合(用&形式赋值)。
refcount:计数器,表示指向这个zval变量容器的变量个数。
php5.3版本之前的垃圾回收机制
1、每个内存对象都分配一个计数器,当内存对象被变量引用时,计数器+1;
2、当删除变量时(unset()),计数器-1;
3、当计数器=0时,表明内存对象没有被使用,该内存对象则进行销毁,垃圾回收完成。
循环引用引发的内存泄露问题
php5.3版本之前的垃圾回收机制存在一个漏洞,即当数组或对象内部子元素引用其父元素,而此时如果删除父元素,此变量容器并不会被删除,这时候,这一组内存对象已经没用了,但是不能回收,从而导致内存泄露的现象。
$a = array( 'one' );
$a[] = &$a;
unset($a);
新的垃圾回收机制
php5.3版本之后在引用计数的基础上,引入了根缓冲机制,即php启动时默认设置指定zval数量的根缓冲区(默认是10000),把计数减-1大于0的变量投入到根缓冲区,当根缓冲区塞满后,使用深度遍历算法进行垃圾回收,以此解决循环引用导致的内存泄漏问题。