PHP引用计数器和垃圾回收机制(写时复制)

  PHP是一种弱类型语言,具体表现在哪里呢?今天我们讲讲PHP的引用计数器和垃圾回收机制。

PHP的变量是怎么用C语言表示呢?

     当我们用PHP代码创建一个变量的时候,PHP把变量保存在zval容器里面。容器,container,可以想像成一块存储区域,或者一个盒子。

      这个容器里保存着四种东西,一个是类型、一个是这个变量的值

一个是is_ref:它是一个bool型的值,占用一个bit,表示该zval容器(也就是这个变量)是否被引用。还有一个是:refcount 引用计数,这个是用来记录有多少变量指向这个容器。

那我们就会想啦,那变量原来的符号保存在哪里呢?原来PHP有一个表,这个表是专门保存变量符号的,所有的symbol保存在一张symbol table里面(符号表)。
php维护了很多张这样的表,GLOBAL一张,每个函数一张。类的每个方法也有一张。
基本上是按照变量的作用域(scope)来建表的。

      写复制(Copyon Write)

      <?php

       $var = "laruence";

$var_dup= $var;

$var= 1;

     ?>

          PHP在修改一个变量以前,会首先查看这个变量的refcount,如果refcount大于1PHP就会执行一个分离的例程(这个很重要!) 对于上面的代码,当执行到第三行的时候,PHP发现$var指向的zvalrefcount大于1,那么PHP就会复制一个新的zval出来,将原zvalrefcount1,并修改symbol_table,使得$var$var_dup分离(Separation)。这个机制就是所谓的copy on write(写时复制)

你可能感兴趣的:(PHP引用计数器和垃圾回收机制(写时复制))