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

时间:2012-08-15 16:11:39

标签: php

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

测试代码:

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

2 个答案:

答案 0 :(得分:2)

你并没有做任何事情。 var_dump调用可能是在初始化某些内容或留下一些东西。

https://github.com/php/php-src/blob/master/ext/standard/var.c

上查看php_var_dump

答案 1 :(得分:2)

首先: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函数,并且可能还使用了一些内部缓冲区,这是第一次调用时分配的。

解决方案:为了更准确地测量事物,您应该在“测量”之前调用每个输出函数一次,或者在结果的最终输出之前不要调用它们。