[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Как создать и обнаружить утечку памяти в PHP
Страницы: 1, 2
c-alex
Добрый день!
Пытаюсь разобраться что такое утечка памяти в PHP.
Целый день гуглил не могу понять, где и как можно увидеть есть утечка памяти в скрипте или нет.

Сможете для наглядности дать пример PHP скрипта, после выполнения которого получается утечка памяти и объяснить где этот объем утечки можно увидеть?
Zzepish
while(1=1){

$r[]=77;


}
c-alex
Цитата (Zzepish @ 2.07.2013 - 21:04)
while(1=1){

  $r[]=77;


}

причем тут бесконечный цикл?
koala
c-alex, жрет память до времени окончания работы скрипта. Причем много smile.gif


_____________
Vi Veri Veniversum Vivus Vici
c-alex
Спасибо MiksIr,

class A {
  private $b;

  function __construct(){
    $this->b = new B($this);
  }
}

class B {
  private $a;

  function __construct($a){
    $this->a = $a;
  }
}

$i=1;
while($i<=1000){
  $a = new A();
  // 1 ссылка на A ($a).
  // 1 ссылка на B (A::$b).
  // 2 ссылки на A (B::$a).
  unset($a);
  // 1 ссылка на A всё ещё осталась. Память освобождать рановато.
  echo $i."\t".memory_get_usage()."\n";
  $i++;


Я выполнял указанный скрипт, тестировал на PHP 5.2.17 (cli) (built: Jan 6 2011 17:28:41) Zend Engine v2.2.0

в 1-м скрипте memory_get_usage() выдает
в начале: 59880
в конце: 452176

во 2-м скрипте memory_get_usage() выдает
в начале: 60440
в конце: 452744

как я должен был увидеть утечку?
c-alex
второй скрипт (без утечки):

class A {
private $b;

function __construct(){
$this->b = new B($this);
}

function __destruct(){
unset($this->b);
}
}

class B {
private $a;

function __construct($a){
$this->a = $a;
}
}

$i=1;
while($i<=1000){
$a = new A();
// 1 ссылка на A ($a).
// 1 ссылка на B (A::$b).
// 2 ссылки на A (B::$a).
unset($a);
// 1 ссылка на A (минус одна в B::__destruct).
// 0 ссылок на A (unset). Память можно освободить.
echo $i."\t".memory_get_usage()."\n";
$i++;
}
killer8080
Цитата (MiksIr @ 2.07.2013 - 22:06)
На PHP утечку памяти в классическом ее смысле получить очень трудно, ибо интерпретатор языка внимательно следит за этим. Особо начиная с 5.3.

утечку памяти получить легко, этим славится create_function wink.gif
glock18
Цитата (MiksIr @ 3.07.2013 - 11:04)
Цитата (killer8080 @ 3.07.2013 - 09:48)
утечку памяти получить легко, этим славится create_function wink.gif

О, да. По-этому, лучше забыть навсегда об этой функции и использовать замыкания wink.gif

amen
killer8080
Цитата (MiksIr @ 3.07.2013 - 14:04)
О, да. По-этому, лучше забыть навсегда об этой функции и использовать замыкания

безусловно, если условия не требуют поддержки <5.3 wink.gif
Zzepish
Цитата
Бегите из таких мест ) PHP закончило поддержку ветки 5.2 более 2-х лет назад =)

biggrin.gif
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.