1 / 7
文档名称:

Php引用计时器和垃圾回收机制.doc

格式:doc   大小:80KB   页数:7页
下载后只包含 1 个 DOC 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

Php引用计时器和垃圾回收机制.doc

上传人:drp539606 2019/3/19 文件大小:80 KB

下载得到文件列表

Php引用计时器和垃圾回收机制.doc

文档介绍

文档介绍:谈到引用计数器和垃圾回收机制,必须得从php变量说起。总所周知,php是一种弱类型,但具体表现在哪里,程序里面又是怎么表现的呢?php里面又是怎样实现引用计数器的,程序如何区分变量引用和复制?php是如何对已用完的变量进行回收,不同的php版本的不同的垃圾回收机制又是如何实现的?引用计数器讲到引用计数器,不得不先说一下变量的c语言实现。如下,几个变量的结构体和联合体:zvalue_value联合体:typedef union _zvalue_value {   long lval;                  /* long value */   double dval;                /* double value */ struct { char *val;   int len; } str; HashTable *ht;              /* hash table value */   zend_object_value obj; } zvalue_value; zval的结构:struct _zval_struct {   /* Variable information */   zvalue_value value;      /* value */ zend_uint refcount__gc;   zend_uchar type;    /* active type */   zend_uchar is_ref__gc; };  zval可以看成一个容器,zvalue_value是该容器存储变量值的联合体,refcount__gc是引用计数,记录引用数,is_ref__gc是标志这个容器是否真正的引用,type表示这个变量的类型。zend根据type值来决定访问value的哪个成员,可用值如下:IS_NULLN/:首先是PHP的数组其实就是一个HashTable,这就解释了为什么PHP能够支持关联数组了;其次,Resource就是一个long值,它里面存放的通常是个指针、一个内部数组的index或者其它什么只有创建者自己才知道的东西,可以将其视作一个handle。写复制(CopyonWrite)<?php  $var="laruence";$var_dup=$var;$var=1;?>PHP在修改一个变量以前,会首先查看这个变量的refcount,如果refcount大于1,PHP就会执行一个分离的例程,对于上面的代码,当执行到第三行的时候,PHP发现$var指向的zval的refcount大于1,那么PHP就会复制一个新的zval出来,将原zval的refcount减1,并修改symbol_table,使得$var和$var_dup分离(Separation)。这个机制就是所谓的copyonwrite(写时复制)。题外话:写时复制技术的一个比较有名的应用是在unix类操作系统内核中,当一个