首页 > 解决方案 > 为什么增加 zval 的引用计数不起作用?

问题描述

我正在转储一个在 PHP 7.3.5 上运行的 zval 容器(opcache 已激活,并且 PHP 已启用线程安全),遵循以下给定代码:

<?php 
$a = "new string";
$b = $a;
xdebug_debug_zval( 'a' );

根据 php.net文档示例 #3 增加 zval 的 refcount 它输出refcount=2

a: (refcount=2, is_ref=0)='new string'

在我的设置(php7.3.5)上,它输出 refcount =1

a:
(refcount=1, is_ref=0)string 'new string' (length=10)

实际上,我使用 PHP5.6 达到了与 php.net 文档相同的输出。PHP7 内部发生了什么变化以及为什么 refcount 保持为 1 ?

标签: phpphp-internals

解决方案


正如 Nikita 在评论中指出的那样,作为常量文字的字符串是 inned - 这是一个内部术语,意思类似于“字符串的单例” - 因此不计入引用。

除了内部字符串之外,不可变数组(即在内存中的形状和位置在运行时可能不会改变的数组)也不会被引用计数。

Xdebug 3.0 将使用补丁进行更新,这将允许它显示字符串何时被保留,或者数组何时是不可变的。


推荐阅读