网管必读 深入探讨PHP中的内存管理问题(5)_PHP应用_黑客防线网安服务器维护基地--Powered by WWW.RONGSEN.COM.CN

网管必读 深入探讨PHP中的内存管理问题(5)

作者:黑客防线网安PHP维护基地 来源:黑客防线网安PHP维护基地 浏览次数:0

本篇关键词:内存管理问题探讨
黑客防线网安网讯:   最后,在第三行,引擎再一次取出与变量$b相关的值并且检查是否有必要进行分离。这一次该值没有被分离,因为前面没有包括一个检查。下面是get_var_and_separate()函数中与refcount检查有...

   最后在第三行引擎再一次取出与变量$b相关的值并且检查是否有必要进行分离这一次该值没有被分离,因为前面没有包括一个检查下面是get_var_and_separate()函数中与refcount检查有关的部分代码:

if ((*varval)->is_ref || (*varval)->refcount < 2) {
 /* varname是唯一的实际引用,
 * 或者它是对其它变量的一个完全引用
 *任何一种方式:都没有进行分离
 */
 return *varval;
}

  这一次,尽管refcount为2,却没有实现分离,因为这个值是一个完全引用。引擎能够自由地修改它而不必关心其它变量值的变化。

  八、 分离问题

  尽管已经存在上面讨论到的复制和引用技术,但是还存在一些不能通过is_ref和refcount操作来解决的问题。请考虑下面这个PHP代码块:

<?php
$a = 1;
$b = $a;
$c = &$a;
?>

  在此,你有一个需要与三个不同的变量相关联的值。其中,两个变量是使用了"change-on-write"完全引用方式,而第三个变量处于一种可分离的"copy-on-write"(写复制)上下文中。如果仅使用is_ref和refcount来描述这种关系,有哪些值能够工作呢?

  回答是:没有一个能工作。在这种情况下,这个值必须被复制到两个分离的zval*中,尽管两者都包含完全相同的数据(见图2)。


图2.引用时强制分离

  同样,下列代码块将引起相同的冲突并且强迫该值分离出一个副本(见图3)。


图3.复制时强制分离

<?php
$a = 1;
$b = &$a;
$c = $a;
?>

  注意,在这里的两种情况下,$b都与原始的zval对象相关联,因为在分离发生时引擎无法知道介于到该操作当中的第三个变量的名字。

  九、 总结

  PHP是一种托管语言。从普通用户角度来看,这种仔细地控制资源和内存的方式意味着更为容易地进行原型开发并导致出现更少的冲突。然而,当我们深入"内里"之后,一切的承诺似乎都不复存在,最终还要依赖于真正有责任心的开发者来维持整个运行时刻环境的一致性。

 

    黑客防线网安服务器维护方案本篇连接:http://www.rongsen.com.cn/show-13947-1.html
网站维护教程更新时间:2012-03-30 05:06:20  【打印此页】  【关闭
我要申请本站N点 | 黑客防线官网 |  
专业服务器维护及网站维护手工安全搭建环境,网站安全加固服务。黑客防线网安服务器维护基地招商进行中!QQ:29769479

footer  footer  footer  footer