Сборщик мусора - PullRequest
       4

Сборщик мусора

2 голосов
/ 14 марта 2011

Я хочу спросить вас, если в 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 ]

2 голосов
/ 14 марта 2011

Запустите тест на вашем конкретном случае, чтобы узнать:

<?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 голосов
/ 14 марта 2011

Да, это так. Локальные переменные располагаются в конце вызова функции. И если одна из этих локальных переменных была объектом, на нее больше нет ссылок. Поэтому он будет освобожден сборщиком мусора.

0 голосов
/ 14 марта 2011

Во-первых, я думаю, что вы должны точно описать, что вы подразумеваете под "в конце функции", вы имеете в виду в конце вызова функции или ...?

PHP сохраняет функцию в памяти как конструкцию, если хотите, невыполненный код, затем, когда функция выполняется в зависимости от того, что функция на самом деле делает, выделяется память.

Например, если бы у меня была следующая функция:

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

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

функция вызывается и для массива создается ссылка на память, каждый раз, когда вы повторяете цикл, память увеличивается.

Затем функция завершается, но если вы заметили, что данные не возвращаются, это потому, что локальная переменная доступна только для этой текущей области, там она больше не будет использоваться и сборщик мусора очищает память.

Так что да, он очищает выделенную память в конце вызова функции.

Небольшой совет (не относится к объектам в PHP 5).

вы можете передавать данные по ссылкам, так что вы можете изменять только одну и ту же выделенную память независимо от функции,

например:

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

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

Я передаю точку в $data новой переменной, которая просто указывает на старую, таким образом вы можете передавать данные, не заставляя сборщик мусора использовать больше ресурсов.

...