监理公司管理系统 | 工程企业管理系统 | OA系统 | ERP系统 | 造价咨询管理系统 | 工程设计管理系统 | 签约案例 | 购买价格 | 在线试用 | 手机APP | 产品资料
X 关闭
鹰潭网站建设公司

当前位置:工程项目OA系统 > 泛普各地 > 江西OA系统 > 鹰潭OA > 鹰潭网站建设公司

PHP 5中垃圾回收算法的演化

申请免费试用、咨询电话:400-8352-114

鹰潭网站建设www.diyphp.net

PHP是一门保管型言语,在PHP编程中程序员不需求手工处置内存资源的分配与开释(运用C编写PHP或Zend扩展在外),这就意味着PHP本身完结了废物回收机制(Garbage Collection)。如今假若去PHP官方网站(php.net)可以看到,其时PHP5的两个分支版别PHP5.2和PHP5.3是分别更新的,这是由于许多项目仍然运用5.2版另外PHP,而5.3版别对5.2并不是完全兼容。PHP5.3在PHP5.2的基础上做了许多改善,其间废物回收算法就归于一个比较大的改动。本文将分别谈论PHP5.2和PHP5.3的废物回收机制,并谈论这种演化和改善关于程序员编写PHP的影响以及要注重的问题。

  PHP变量及关联内存对象的内部标明

  废物回收说终究是对变量及其所关联内存对象的操作,所以在谈论PHP的废物回收机制之前,先简明引见PHP中变量及其内存对象的内部标明(其C源代码中的标明)。

  PHP官方文档中将PHP中的变量划分为两类:标量类型和凌乱类型。标量类型包含布尔型、整型、浮点型和字符串;凌乱类型包含数组、对象和资源;还有一个NULL比较稀奇,它不划分为任何类型,而是单独成为一类。

  全部这些类型,在PHP内部统一用一个叫做zval的结构标明,在PHP源代码中这个结构名称为“_zval_struct”。zval的具体定义在PHP源代码的“Zend/zend.h”文件中,下面是关联代码的摘录。

 

  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;

  struct _zval_struct {

  /* Variable information */

  zvalue_value value;

  /* value */

  zend_uint refcount__gc;

  zend_uchar type; /* active type */

  zend_uchar is_ref__gc;

  };

 

  其间联合体“_zvalue_value”用于标明PHP中全部变量的值,这里之所以运用union,是由于一个zval在一个时辰只能标明一种类型的变量。可以看到_zvalue_value中只需5个字段,可是PHP中算上NULL有8种数据类型,那么PHP内部是如何用5个字段标明8种类型呢?这算是PHP描绘比较美妙的一个当地,它始末复用字段达到了减少字段的目的。例如,在PHP内部布尔型、整型及资源(只需存储资源的标识符即可)都是始末lval字段存储的;dval用于存储浮点型;str存储字符串;ht存储数组(注重PHP中的数组其实是哈希表);而obj存储对象类型;假若全部字段全部置为0或NULL则标明PHP中的NULL,这样就达到了用5个字段存储8种类型的值。

  而其时zval中的value(value的类型就是_zvalue_value)终究标明那种类型,则由“_zval_struct”中的type断定。_zval_struct就是zval在C言语中的具体完结,每个zval标明一个变量的内存对象。除了value和type,可以看到_zval_struct中还有两个字段refcount__gc和is_ref__gc,从其后缀就可以断定这两个家伙与废物回收有关。没错,PHP的废物回收全赖这俩字段了。其间refcount__gc标明其时有几个变量引用此zval,而is_ref__gc标明其时zval能否被按引用引用,这话听起来很拗口,这和PHP中zval的“Write-On-Copy”机制有关,由于这个论题不是本文关键,因此这里不再胪陈,读者只需记住refcount__gc这个字段的作用即可。

  PHP5.2中的废物回收算法——Reference Counting

  PHP5.2中运用的内存回收算法是大名鼎鼎的Reference Counting,这个算法中文翻译叫做“引用计数”,其思想非常直观和简练:为每个内存对象分配一个计数器,当一个内存对象建立时计数器初始化为1(因此此时总是有一个变量引用此对象),往后每有一个新变量引用此内存对象,则计数器加1,而每当减少一个引用此内存对象的变量则计数器减1,当废物回收机制运作的时分,将全部计数器为0的内存对象销毁并回收其占用的内存。而PHP中内存对象就是zval,而计数器就是refcount__gc。

  例如下面一段PHP代码演示了PHP5.2计数器的使命原理(计数器值始末xdebug得到):

 

  

  $val1 = 100; //zval(val1).refcount_gc = 1;

  $val2 = $val1; //zval(val1).refcount_gc = 2,zval(val2).refcount_gc = 2(由所以Write on copy,其时val2与val1一同引用一个zval)

  $val2 = 200; //zval(val1).refcount_gc = 1,zval(val2).refcount_gc = 1(此处val2新建了一个zval)

  unset($val1); //zval(val1).refcount_gc = 0($val1引用的zval再也不可用,会被GC回收)

  ?>

 

  Reference Counting简略直观,完结便当,但却存在一个丧身的缺陷,就是简略构成内存泄露。许多伴侣可以早年知道到了,假若存在循环引用,那么Reference Counting就可以引起内存泄露。例如下面的代码:

 

  <?php

发布:2007-03-31 14:58    编辑:泛普软件 · xiaona    [打印此页]    [关闭]
鹰潭OA
联系方式

成都公司:成都市成华区建设南路160号1层9号

重庆公司:重庆市江北区红旗河沟华创商务大厦18楼

咨询:400-8352-114

加微信,免费获取试用系统

QQ在线咨询

泛普鹰潭网站建设公司其他应用

鹰潭软件开发公司 鹰潭门禁系统 鹰潭物业管理软件 鹰潭仓库管理软件 鹰潭餐饮管理软件 鹰潭网站建设公司