争怎路由网/网站教程/内容

php中的引用以及垃圾回收的区分

网站教程2024-04-15 阅读
网页的本质就是超级文本标记语言,通过结合使用其他的Web技术(如:脚本语言、公共网关接口、组件等),可以创造出功能强大的网页。因而,超级文本标记语言是万维网(Web)编程的基础,也就是说万维网是建立在超文本基础之上的。超级文本标记语言之所以称为超文本标记语言,是因为文本中包含了所谓“超级链接”点。
本篇文章给大家带来的内容是关于php中的引用以及垃圾回收的分析,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

每个php变量存在一个叫"zval"的变量容器中。一个zval变量容器,除了包含变量的类型和值,还包括两个字节的额外信息。第一个是"is_ref",是个bool值,用来标识这个变量是否是属于引用集合(reference set)。通过这个字节,php引擎才能把普通变量和引用变量区分开来,由于php允许用户通过使用&来使用自定义引用,zval变量容器中还有一个内部引用计数机制,来优化内存使用。第二个额外字节是"refcount",用以表示指向这个zval变量容器的变量(也称符号即symbol)个数。所有的符号存在一个符号表中,其中每个符号都有作用域(scope),那些主脚本(比如:通过浏览器请求的的脚本)和每个函数或者方法也都有作用域。

//php中对象为引用传递

is_ref = 0, refcount = 0 zval容器会在脚本执行结束时被销毁

引用官方的例子

<?php
$a = array( 'one' );
$a[] =& $a;
xdebug_debug_zval( 'a' );
a: (refcount=2, is_ref=1)=array (
   0 => (refcount=1, is_ref=0)='one',
   1 => (refcount=2, is_ref=1)=...
)

自引用(curcular reference,自己是自己的一个元素)的数组的zval

执行unset$a 会释放变量与zval的内存关联 但是闭环自己内部仍存在

(refcount=1, is_ref=1)=array (
   0 => (refcount=1, is_ref=0)='one',
   1 => (refcount=1, is_ref=1)=...
)

Zvals after removal of array with a circular reference demonstrating the memory leak

但是此时 没有变量 能操作到 zval 容器 时间上此时 已经成为了内存垃圾 确无法释放

回收机制:简单来说 就是执行完脚本后 对仍存在的变量 进行 整体数据全部refcount -1 如果减为0 则判定为垃圾 进行内存容器销毁

相关推荐:

PHP的垃圾回收机制 可回收垃圾有哪些 垃圾回收 不可回收垃

PHP垃圾回收机制—引用计数的基本知识

以上就是php中的引用以及垃圾回收的分析的详细内容,更多请关注php中文网其它相关文章!

  • 微信

  • 网站建设是一个广义的术语,涵盖了许多不同的技能和学科中所使用的生产和维护的网站。



    ……

    标签:php中的引用以及垃圾回收的区分
    相关阅读