PHP中使用unset销毁变量并内存释放问题

复制代码 代码如下:

  for ( $i = 1; $i < 100; $i++ ) {

  $str = str_repeat('01234567', $i);

  $a = memory_get_usage();

  unset($str);

  $b = memory_get_usage();

  echo "\n

  ".$i.': '.($b - $a).' Bytes.';

  }

  从结果看出:

  8 x 32 = 256 在256字节长的时候才真正有必要释放内存,有些人说,不如直接$str = null来的速度快。

  结果如下:

  1: 0 Bytes.

  2: 0 Bytes.

  3: 0 Bytes.

  4: 0 Bytes.

  5: 0 Bytes.

  6: 0 Bytes.

  7: 0 Bytes.

  8: 0 Bytes.

  9: 0 Bytes.

  10: 0 Bytes.

  11: 0 Bytes.

  12: 0 Bytes.

  13: 0 Bytes.

  14: 0 Bytes.

  15: 0 Bytes.

  16: 0 Bytes.

  17: 0 Bytes.

  18: 0 Bytes.

  19: 0 Bytes.

  20: 0 Bytes.

  21: 0 Bytes.

  22: 0 Bytes.

  23: 0 Bytes.

  24: 0 Bytes.

  25: 0 Bytes.

  26: 0 Bytes.

  27: 0 Bytes.

  28: 0 Bytes.

  29: 0 Bytes.

  30: 0 Bytes.

  31: 0 Bytes.

  32: -272 Bytes.

  33: -280 Bytes.

  34: -288 Bytes.

  35: -296 Bytes.

  36: -304 Bytes.

  37: -312 Bytes.

  38: -320 Bytes.

  39: -328 Bytes.

  40: -336 Bytes.

  41: -344 Bytes.

  42: -352 Bytes.

  43: -360 Bytes.

  44: -368 Bytes.

  45: -376 Bytes.

  46: -384 Bytes.

  47: -392 Bytes.

  48: -400 Bytes.

  49: -408 Bytes.

  50: -416 Bytes.

  51: -424 Bytes.

  52: -432 Bytes.

  53: -440 Bytes.

  54: -448 Bytes.

  55: -456 Bytes.

  56: -464 Bytes.

  57: -472 Bytes.

  58: -480 Bytes.

  59: -488 Bytes.

  60: -496 Bytes.

  61: -504 Bytes.

  62: -512 Bytes.

  63: -520 Bytes.

  64: -528 Bytes.

  65: -536 Bytes.

  66: -544 Bytes.

  67: -552 Bytes.

  68: -560 Bytes.

  69: -568 Bytes.

  70: -576 Bytes.

  71: -584 Bytes.

  72: -592 Bytes.

  73: -600 Bytes.

  74: -608 Bytes.

  75: -616 Bytes.

  76: -624 Bytes.

  77: -632 Bytes.

  78: -640 Bytes.

  79: -648 Bytes.

  80: -656 Bytes.

  81: -664 Bytes.

  82: -672 Bytes.

  83: -680 Bytes.

  84: -688 Bytes.

  85: -696 Bytes.

  86: -704 Bytes.

  87: -712 Bytes.

  88: -720 Bytes.

  89: -728 Bytes.

  90: -736 Bytes.

  91: -744 Bytes.

  92: -752 Bytes.

  93: -760 Bytes.

  94: -768 Bytes.

  95: -776 Bytes.

  96: -784 Bytes.

  97: -792 Bytes.

  98: -800 Bytes.

  99: -808 Bytes.

  我们先看一个例子

  

复制代码 代码如下:

  <?php

  $s=str_repeat('1',255); //产生由255个1组成的字符串

  $m=memory_get_usage(); //获取当前占用内存

  unset($s);

  $mm=memory_get_usage(); //unset()后再查看当前占用内存

  echo $m-$mm;

  ?>

  最后输出unset()之前占用内存减去unset()之后占用内存,如果是正数,那么说明unset($s)已经将$s从内存中销毁(或者说,unset()之后内存占用减少了),可是我在PHP5和windows平台下,得到的结果是:-48。这是否可以说明,unset($s)并没有起到销毁变量$s所占用内存的作用呢?我们再作下面的例子:

  

复制代码 代码如下:

  <?php

  $s=str_repeat('1',256); //产生由256个1组成的字符串

  $m=memory_get_usage(); //获取当前占用内存

  unset($s);

  $mm=memory_get_usage(); //unset()后再查看当前占用内存

  echo $m-$mm;

  ?>

  这个例子,和上面的例子几乎相同,唯一的不同是,$s由256个1组成,即比第一个例子多了一个1,得到结果是:224。这是否可以说明,unset($s)已经将$s所占用的内存销毁了?

  通过上面两个例子,我们可以得出以下结论:结论一、unset()函数只能在变量值占用内存空间超过256字节时才会释放内存空间。

  那么是不是只要变量值超过256,使用unset就可以释放内存空间呢?我们再通过一个例子来测试一下:

  

复制代码 代码如下:

  <?php

  $s=str_repeat('1',256); //这和第二个例子完全相同

  $p=&$s;

  $m=memory_get_usage();

  unset($s); //销毁$s

  $mm=memory_get_usage();

  echo $p.'<br />';

  echo $m-$mm;

  ?>

  '刷新页面,我们看到第一行有256个1,第二行是-48,按理说我们已经销毁了$s,而$p只是引用$s的变量,应该是没有内容了,另外,unset($s)后内存占用却比unset()前增加了!现在我们再做以下的例子:

  

复制代码 代码如下:

  <?php

  $s=str_repeat('1',256); //这和第二个例子完全相同

  $p=&$s;

  $m=memory_get_usage();

  $s=null; //设置$s为null

  $mm=memory_get_usage();

  echo $p.'<br />';

  echo $m-$mm;

  ?>

  现在刷新页面,我们看到,输出$p已经是没有内容了,unset()前后内存占用量之差是224,即已经清除了变量占用的内存。本例中的$s=null也可以换成unset(),如下:

  

复制代码 代码如下:

  <?php

  $s=str_repeat('1',256); //这和第二个例子完全相同

  $p=&$s;

  $m=memory_get_usage();

  unset($s); //销毁$s

  unset($p);

  $mm=memory_get_usage();

  echo $p.'<br />';

  echo $m-$mm;

  ?>

  我们将$s和$p都使用unset()销毁,这时再看内存占用量之差也是224,说明这样也可以释放内存。那么,我们可以得到另外一条结论:结论二、只有当指向该变量的所有变量(如引用变量)都被销毁后,才会释放内存。

  相信经过本文的例子后,大家应该对unset()有所了解了,最起码,本人用unset()也是为了在变量不起作用时,释放内存。