> 백엔드 개발 > PHP 튜토리얼 > PHP 객체에 대한 재귀적 참조로 인한 메모리 누수 분석_php 팁

PHP 객체에 대한 재귀적 참조로 인한 메모리 누수 분석_php 팁

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
풀어 주다: 2016-05-16 20:36:50
원래의
1095명이 탐색했습니다.

일반적으로 PHP 객체에 대한 재귀적 참조가 있으면 메모리 누수가 발생합니다. 이 버그는 오랫동안 PHP에 존재했습니다. 먼저 이 버그를 재현해 보겠습니다. 샘플 코드는 다음과 같습니다.

<&#63;php
class Foo {
  function __construct() {
    $this->bar = new Bar($this);
  }
}

class Bar {
  function __construct($foo) {
    $this->foo = $foo;
  }
}

for ($i = 0; $i < 100; $i++) {
  $obj = new Foo();

  unset($obj);
  echo memory_get_usage(), "/n";
}
&#63;> 

로그인 후 복사

위 코드를 실행하면 메모리 사용량이 변경되지 않고 유지되어야 하지만 실제로는 계속 증가하고 unset이 완전히 적용되지 않는 것을 알 수 있습니다.

현재 개발은 대부분 프레임워크를 기반으로 합니다. 애플리케이션에는 복잡한 개체 관계가 있으므로 이러한 문제가 발생할 가능성이 높습니다. 어떤 방법을 사용할 수 있는지 살펴보겠습니다.

<&#63;php
class Foo {
  function __construct() {
    $this->bar = new Bar($this);
  }

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

class Bar {
  function __construct($foo) {
    $this->foo = $foo;
  }
}

for ($i = 0; $i < 100; $i++) {
  $obj = new Foo();

  $obj->__destruct();
  unset($obj);
  echo memory_get_usage(), "/n";
}
&#63;>

로그인 후 복사

방법이 좀 추악했지만 결국 처리됐습니다. 다행히 이 버그는 PHP5.3의 CVS 코드에서 수정되었습니다.

PHP 프로그램을 설계할 때 주의할 점은 바로 이것! 나는 이 기사에서 설명하는 내용이 모든 사람의 PHP 프로그램 설계에 대한 특정 참조 가치를 가지고 있다고 믿습니다.

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿