【发布时间】: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