易截截图软件、单文件、免安装、纯绿色、仅160KB

php variable circular reference 翻译

    循环引用一直是PHP(应用)中一个突出的问题。问题的出现是由于这样的一个事实:PHP为php内部变量使用一个“引用计数器”内存分配机制。这一机制对一些相比来说较长时间运行的脚本(比如,应用服务器或者eZ测试组件)会引发问题,因为内存在脚本结束前事不会被释放掉的。但是,(几乎)没有人对这个实际的问题了解很多,所以这里便对PHP变量循环引用的问题加以阐述。
    在PHP中,会为每一个变量容器(zval)维护一个"引用计数器"。哪些容器会被一个包含函数的所有本地变量名称的标示表所指向。
每指向zval的一个变量、数组的一个元素、对象的一个属性都会使得zval的引用计数器加1。相反的,每一次调用unset将一个指向zval容器的变量销毁时都会使得这个计数器减1,或者当一个变量因为它所处的函数因调用完毕而结束时zval的引用计数器也会减1。要想阅读对应用的更彻底的解释请看我前段时间为php|architect
写的文章
循环引用的问题在创建一个数组或一个对象时就开始了:
   <?php $tree = array( 'one' ); ?>
这会在内存中创建一个如下图所示的结构:
现在,如果我们继续在这个数组变量上添加一个指向这个数组本身的新元素,像下面这样:
<?php $tree[] = $tree; ?>
现在就出现了这样循环引用:
如你所看到的,现在有两个变量指向这个数组,一个是变量$tree,一个是这个数组的第二个元素。
因为现在有两个变量名执行这个容器,所以这个容器的引用计数器的值为2.
现在,进行第二步--当我们调用unset($tree)时便会出现那个“突出的问题”。如我在前面所说,对unset的一次调用会使得zval的“引用计数器”值减1,现在就是这个数组。
现在的内存结构看上去是这样的:
注意,现在已经不再有哪个变量指向数组$tree的容器。因为PHP没有办法释放这个数据(内存块),于是memory leak便产生了。然而,PHP在每个请求结束后又都会释放掉所有分配的内存,所以这并不是一个硬性的memory leak。但这对一些长时间运行的脚本已经依稀后台程序来说已经很要命了。
幸运的是我们有可以解决这个问题的办法。第一个办法是用一套新的垃圾回收算法,另一个是用“循环跟踪”的办法来增强(现有的)引用计数系统。,David Wang正在着手第二个方案的研究,他是Google Summer of Code的一名学生,他曾说过他正在完善中,我等不及要玩玩这个玩意了:)


相关文档:

php的session与cookie的区别

1、首先通过代码来看看表象:
<?php
  session_start();
 
  if (empty($_SESSION['count'])) {
      $_SESSION['count'] = 1;
  } else {
      $_SESSION['count']++;
  }
  var_dump($_SESSION);
 
  var_ ......

php 构造函数参数

在PHP里,如果你没有手写构造函数,则php在实例化这个对象的时候,会自动为类成员以及类方法进行初始化,分配内存等工作,但是有些时候不能满足我们的要求,比如我们要在对象实例化的时候传递参数,那么就需要手动编写构造函数了,手写构造函数有两种写法,只是表现形式不同,其实本质一样
class test
{
  &nb ......

PHP的日期时间函数date()

整理活:PHP的日期时间函数date()
1,年-月-日
echo date('Y-m-j');
2007-02-6
echo date('y-n-j');
07-2-6
大写Y表示年四位数字,而小写y表示年的两位数字;
小写m表示月份的数字(带前导),而小写n则表示不带前导的月份数字。
echo date('Y-M-j');
2007-Feb-6
echo date('Y-m-d');
2007-02-06
大写M表示月份的 ......

php不包含某字符串的正则表达式


 摘要: 用正则实现包含某个字符串很容易,但如果实现不包含某个字符串呢?作者给出了一个解决方案。
判断一个字符串中是否含有另一字符串,php有很多方法,如下:
1. 常见函数
strstr($str, "abc");  
strstr($str, "abc");
2. 正则匹配
preg_match("/(abc)/is", $str);  
p ......

PHP类的访问控制

PHP中类的方法也和C++通过关键字 private
、Public
、 protected
来控制的。下边是详细说明:
1、private
     函数前使用关键字Private表示函数是私有的,私有的意思顾名思义,针对当前类私有,无论是他的子类还是他的实例都无法访问。
     还是先看代码:
 &nbs ......
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号