【问题标题】:Why does a simple PHP unset() memory test utilize twice the amount of memory in PHP 5.3?为什么一个简单的 PHP unset() 内存测试使用 PHP 5.3 中两倍的内存量?
【发布时间】: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); 可以释放更多内存。我假设,如果您只是取消设置单个索引,它不会减少数组本身(即使它们的值是 voidnull 或内部使用的任何值)。这意味着,只要$temp 存在,至少有 100.000 个哈希键(数组是 PHP 中的哈希映射)保存在内存中。
  • 没错,但这里的主要问题是为什么一台服务器为同一个脚本分配两倍的内存量。我将 PHP 5.3.5 服务器降级到 5.2.17,相比之下它仍然显示占用了两倍的内存量。所以它看起来不像是 PHP 版本的东西,而是某种 PHP 或服务器设置。

标签: php memory-management


【解决方案1】:

PHP 3.2.5?那太古老了,甚至没有达到石器时代。 PHP 的内脏经历了 Zend 引擎的彻底重写,因此即使语言本身保持相对相同,您还是在比较两个不同的环境。

但如果版本号是拼写错误,则可能是 32 位 vs. 64 位主机,它将整数的大小增加一倍,可以解释您声称的 2 倍差异。

【讨论】:

  • 我能分辨出与 phpinfo() 的区别吗? 3.3.5 说系统“Linux sn19 2.6.18-194.32.1.el5 #1 SMP Wed Jan 5 17:52:25 EST 2011 x86_64”和 3.2.5 说“Linux cloud-212-47-211- 132.netpoint.ee 2.6.35 #1 SMP Fri Aug 6 23:39:12 EEST 2010 x86_64"
  • 嗯,主机显然是 64 位的。要从 PHP 中检查,请在此处尝试解决方案:stackoverflow.com/questions/2353473/…
  • 好吧,我将 PHP 5.3.5 服务器降级到 5.2.17,相比之下它仍然显示占用了两倍的内存量。这很奇怪。所以它看起来不像是 PHP 版本的东西,而是某种 PHP 或服务器设置。有什么想法吗?
  • 是的,这是 64 位与 32 位的情况。谢谢!这是否意味着如果 PHP 也在 64 位上运行,我应该将它的内存限制加倍?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-09
  • 2017-06-24
  • 2010-10-06
  • 1970-01-01
  • 2014-02-06
  • 2021-01-26
  • 1970-01-01
相关资源
最近更新 更多