【发布时间】:2011-08-15 14:45:27
【问题描述】:
我正在测试脚本运行时 unset() 是否会影响内存,以查看 unset() 或其他已知方法,$var=null 是否更有效。 unset() 确实会影响内存,但由于我在两个不同的虚拟主机上对其进行了测试,我想知道为什么同一个脚本占用的内存量或多或少是两倍?我猜答案很简单,但现在它让我无法理解。脚本本身如下:
<?php
$init=memory_get_usage();
$test=array();
for($i=0;$i<=100000;$i++){
$test[$i]=rand(0,10000000);
}
echo 'MEMORY CHANGE: '.((memory_get_usage()-$init)/1024/1024).'MB<br/>';
for($i=0;$i<=100000;$i++){
unset($test[$i]);
}
echo 'MEMORY CHANGE: '.((memory_get_usage()-$init)/1024/1024).'MB<br/>';
//output on PHP 3.2.5 virtualhost:
//MEMORY CHANGE: 6.98558807373MB
//MEMORY CHANGE: 0.500259399414MB
//output on PHP 5.3.5 virtualhost
//MEMORY CHANGE: 13.970664978MB
//MEMORY CHANGE: 1.00063323975MB
?>
谢谢!
【问题讨论】:
-
你不应该在循环之间重置
$init吗? -
如果你使用 memory_get_usage(true) 而不是 memory_get_usage()?
-
同样的事情发生了。 3.2.5:内存更改:7.25MB 内存更改:1MB 3.3.5:内存更改:14.25MB 内存更改:1.75MB 服务器肯定有问题,但我不知道要查找什么。
-
刚刚自己测试过。我不知道它来自哪里,但最后使用
unset($temp);可以释放更多内存。我假设,如果您只是取消设置单个索引,它不会减少数组本身(即使它们的值是void、null或内部使用的任何值)。这意味着,只要$temp存在,至少有 100.000 个哈希键(数组是 PHP 中的哈希映射)保存在内存中。 -
没错,但这里的主要问题是为什么一台服务器为同一个脚本分配两倍的内存量。我将 PHP 5.3.5 服务器降级到 5.2.17,相比之下它仍然显示占用了两倍的内存量。所以它看起来不像是 PHP 版本的东西,而是某种 PHP 或服务器设置。
标签: php memory-management