1

如果我在我的计算机上运行以下 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. 为什么是这样?

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

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

//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入口点跟踪它。

4

1 回答 1

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 在第一次测量之前修改为 echo 时,我们得到

[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|
于 2012-12-09T22:05:24.060 回答