定义了一个常量,但内存没有变化


defined a constant but memory has no change

我试图比较内存中使用的常量和变量,但发现了一个奇怪的现象。

测试代码:

<?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