php - 为什么增加 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 ?
解决方案
正如 Nikita 在评论中指出的那样,作为常量文字的字符串是 inned - 这是一个内部术语,意思类似于“字符串的单例” - 因此不计入引用。
除了内部字符串之外,不可变数组(即在内存中的形状和位置在运行时可能不会改变的数组)也不会被引用计数。
Xdebug 3.0 将使用此补丁进行更新,这将允许它显示字符串何时被保留,或者数组何时是不可变的。
推荐阅读
- eclipse - 如何仅将 Eclipse 项目的内容推送到 github
- python - 如何在 matplotlib 的箱线图中自定义(重新定义)异常值(传单)?
- c - 当两个或多个哲学家检查互斥锁为 1 并同时关闭互斥锁并进入测试函数时会发生什么
- wolfram-mathematica - 在 Mathematica 中重新排列嵌套列表
- asp.net - 对于在 IIS 8.5 上运行的 ASP.NET 站点,新的 DLL 加载速度非常慢
- android - 如何保存按钮的文本(SharedPreferences)
- amazon-web-services - Amazon SES 如何跟踪单个链接点击
- jenkins - 以特定用户身份执行 jenkinsfile 中的命令
- angular - 角表不工作
- c# - 如何将 json 属性从我的前端分配给 API 中的多个后端模型?