为什么get_memory_usage保留内存?

时间:2012-12-09 21:38:44

标签: php php-internals

如果我在计算机上运行以下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源代码,并且我的跟踪执行能力是nill。

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

1 个答案:

答案 0 :(得分: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|