【问题标题】:Why Does get_memory_usage Retain Memory?为什么 get_memory_usage 会保留内存?
【发布时间】:2012-11-27 08:17:25
【问题描述】:

如果我在我的电脑上运行以下 PHP 程序

echo memory_get_usage();
echo "|";
echo memory_get_usage();
echo "|";
echo memory_get_usage();

我得到了输出

635048|635080|635080

由此可见,对memory_get_usage 的初始调用似乎保留了 32KB 的内存。我在没有echo 语句的情况下尝试了这个

echo memory_get_usage();
echo memory_get_usage();
echo memory_get_usage();

得到了类似的结果

634504634536634536
//broken out 634504, 634536, 634536

虽然删除 echo 语句会减少脚本的整体内存使用量,但在初始调用 memory_get_usage 后仍会保留 32KB。为什么是这样?

我已经在多台计算机上尝试过,虽然实际数字不同,但差距保持不变。

如果我看(我认为是)这个函数的来源

//File: php-5.3.19/ext/standard/var.c
PHP_FUNCTION(memory_get_usage) {
    zend_bool real_usage = 0;

    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|b", &real_usage) == FAILURE) {
        RETURN_FALSE;
    }

    RETURN_LONG(zend_memory_usage(real_usage TSRMLS_CC));
}

我没有在其中看到任何必须说“将此变量保留在内存中”的内容。但是,我已经很多年没有认真写过 C 语言了,也从来没有专业地破解过 PHP 源代码,而且我跟踪执行的能力是零。

所以,我的问题是,是什么保留了这 32KB 的内存,这发生在 PHP 源代码的什么地方和/或我如何从 memory_get_usage 入口点跟踪它。

【问题讨论】:

  • 可能是初始输出缓冲?如果您在第一个小节之前回显某些内容会怎样?
  • 就是这样@Charles - 如果你愿意,请在下面回答,我会投票/接受。

标签: php php-internals


【解决方案1】:

这可能是必须创建输出的结果。也许涉及到一些输出缓冲?

在命令提示符处:

[charles@lobotomy /tmp]$ php --version
PHP 5.4.9 (cli) (built: Nov 22 2012 12:59:04)
Copyright (c) 1997-2012 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2012 Zend Technologies
    with Xdebug v2.2.0rc1, Copyright (c) 2002-2012, by Derick Rethans
[charles@lobotomy /tmp]$ cat test.php
<?php
#echo '|';
echo memory_get_usage();
echo '|';
echo memory_get_usage();
echo '|';
echo memory_get_usage();
echo '|';

[charles@lobotomy /tmp]$ php test.php
227024|227056|227056|

当test.php被修改为在第一次测量之前回显,我们得到

[charles@lobotomy /tmp]$ cat test.php
<?php
echo '|';
echo memory_get_usage();
echo '|';
echo memory_get_usage();
echo '|';
echo memory_get_usage();
echo '|';

[charles@lobotomy /tmp]$ php test.php
|227192|227192|227192|

【讨论】:

    猜你喜欢
    • 2021-05-14
    • 2014-02-17
    • 1970-01-01
    • 2016-04-16
    • 2013-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多