【问题标题】:Why increasing refcount of zval not working?为什么增加 zval 的引用计数不起作用?
【发布时间】:2019-11-12 00:08:03
【问题描述】:

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

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

根据 php.net documentation Example #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?

【问题讨论】:

  • 字符串已被保留,因此不使用引用计数。

标签: php php-internals


【解决方案1】:

正如 Nikita 在 cmets 中所指出的,字符串作为常量字面量是 inned - 这是一个内部术语,意思类似于“字符串的单例” - 因此不被引用计数。

与内部字符串一样,不可变数组(即在内存中的形状和位置在运行时可能不会改变的数组)也不计入引用计数。

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

【讨论】:

    猜你喜欢
    • 2013-05-01
    • 1970-01-01
    • 2017-03-12
    • 2021-05-22
    • 2022-12-17
    • 1970-01-01
    • 1970-01-01
    • 2022-06-18
    • 1970-01-01
    相关资源
    最近更新 更多