我试图比较内存中使用的常量和变量,但发现了一个奇怪的现象。
测试代码:
<?php
var_dump( memory_get_usage() ); // int(129100)
// I don't understand: I don't do someting but why there has the changed
var_dump( memory_get_usage() ); // int(129156)
var_dump( memory_get_usage() ); // int(129156)
define('hello', 'WORLD');
// why here hasn't changed
var_dump( memory_get_usage() ); // int(129156)
$hello = 'WORLD';
var_dump( memory_get_usage() ); // int(129304)
?>
首先:PHP 有很多内存泄漏。这意味着,它确实在某处分配内存,但不会释放它。所以不要害怕看到这样的效果。但这一次可能是别的:
请看这个例子:
<?php
$data = array(0,0,0,0);
$data[0] = memory_get_usage();
$data[1] = memory_get_usage();
echo $data[0];
echo "'n";
echo $data[1];
echo "'n";
$data[2] = memory_get_usage();
echo $data[2];
echo "'n";
$data[3] = memory_get_usage();
echo $data[3];
echo "'n";
?>
输出将如下所示:
626464
626464
626528
626528
您会看到它在第一次调用"echo"后发生变化,这必须是为输出缓冲区分配内存或类似的东西。也许它在内部使用 printf(buffer, "...", ...)以生成发送到标准输出的字符串。此字符串在以后的调用中重复使用,并在需要时调整为更长的缓冲区。
对var_dump的调用间接使用 echo 函数,并且可能还使用一些内部缓冲区,这是在第一次调用时分配的。
解决方案:为了更准确地测量事物,您应该在"测量"之前调用每个输出函数一次,或者永远不要在结果的最终输出之前调用它们。
你并不是完全什么都不做。var_dump
调用可能是初始化某些内容或留下某些内容。
在 https://github.com/php/php-src/blob/master/ext/standard/var.c 查看php_var_dump