PHP垃圾收集

时间:2011-03-14 17:42:20

标签: php memory garbage-collection

我想问你,在PHP中如果我在一个函数中创建了一个新类,那么在函数的最后会释放内存吗?

例如:Class

class config
{
    var $mapProp    =   array("x"=>4333, "y"=>3520, "w"=>128, "h"=>128);
    var $gameProp   =   array("maxLevel"=>14, "tilesSize"=>256);
    var $mapUrl     =   'map_files';
    function getMapProp()
    {
        return $this->mapProp;
    }
    function getGameProp()
    {
        return $this->gameProp;
    }
    function getMapUrl()
    {
        return $this->mapUrl;
    }
}
$config = new config();

和功能

class framework
{
    function getUserMap()
    {
        require("class/config/config.php");
        require("class/imageManipulation/image.php");       

        $mapUrl     =   $config->getMapUrl();
        $x          =   $_GET['x'];
        $y          =   $_GET['y'];
        $level      =   $_GET['level'];

        $main_img   =   $mapUrl.'/'.$level.'/'.$x.'_'.$y.'.jpg'; 
        //Create a new class
        $image = new imageManipulation();

        //Set Up variables
        $image->setProp($config->getMapProp());
        $image->setGameProp($config->getGameProp());

        return $image->getImage($main_img, $level, $x, $y);
    }       
}
$framework = new framework();

require("class/framework/framework.php");

$path       =   $_GET['path'];

switch ($path) {
    case 'usermap':
        $framework->getUserMap();
        break;
}
在getUserMap中的

我使用了两个类。其中一个是$ config类,另一个是$ image类,在函数结束后会释放用于这两个类的内存吗?

一切顺利, 罗伯特。

3 个答案:

答案 0 :(得分:2)

是的。局部变量在函数调用结束时放置。如果其中一个局部变量是一个对象,则不再引用它。因此它将被垃圾收集器释放。

答案 1 :(得分:2)

对您的确切案例进行测试以找出:

<?php
class bar
{
  public function __construct()
  {
     $this->data = str_repeat('x', 10000000);
  }
}

function foo()
{
  $b = new bar();
  echo memory_get_usage()."\n";
}

echo memory_get_usage()."\n";
foo();
echo memory_get_usage()."\n";

?>

我明白了:

  • 635248
  • 10635960
  • 635312

这表明它确实如此。

显然,这里没有任何内容引用该数据,因此PHP可以释放它。

答案 2 :(得分:0)

首先,我认为你应该用“在函数末尾”准确描述你的意思,你的意思是在函数调用结束时,还是......?

PHP将函数作为构造存储在内存中,如果你愿意,不执行代码,那么当根据函数实际执行的函数执行函数时,就会分配内存。

例如,如果我有以下功能:

function test()
{
    $data = array();

    for($i = 0; $i < 10000; $i++)
    {
        $data[] = array('one','two','three','four','five','six',);
    }
}

调用该函数并为该数组创建对内存的引用,每次迭代循环时,内存都会增加。

然后函数结束但是如果你注意到数据没有返回,那是因为局部变量只适用于当前作用域,因为它将不再使用,垃圾收集器会清除内存。 / p>

所以是的,它会在函数调用结束时清除已分配的内存。

一点提示(不适用于PHP 5中的对象)。

您可以通过引用传递数据,这样您只需修改相同的已分配内存,而不管函数是什么,

例如:

/*
    Allocate the string into the memory into
*/
$data = str_repeat("a",5000);

function minip(&$data)
{
    $_data &= $data;
    $_data = '';
}

我将点传递给$data到一个新变量,它只指向旧变量,这样你就可以传递数据,而不会让垃圾收集器使用更多的资源。