일반적으로 PHP 객체에 대한 재귀적 참조가 있으면 메모리 누수가 발생합니다. 이 버그는 오랫동안 PHP에 존재했습니다. 먼저 이 버그를 재현해 보겠습니다. 샘플 코드는 다음과 같습니다.
<?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"; } ?>
위 코드를 실행하면 메모리 사용량이 변경되지 않고 유지되어야 하지만 실제로는 계속 증가하고 unset이 완전히 적용되지 않는 것을 알 수 있습니다.
현재 개발은 대부분 프레임워크를 기반으로 합니다. 애플리케이션에는 복잡한 개체 관계가 있으므로 이러한 문제가 발생할 가능성이 높습니다. 어떤 방법을 사용할 수 있는지 살펴보겠습니다.
<?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"; } ?>
방법이 좀 추악했지만 결국 처리됐습니다. 다행히 이 버그는 PHP5.3의 CVS 코드에서 수정되었습니다.
PHP 프로그램을 설계할 때 주의할 점은 바로 이것! 나는 이 기사에서 설명하는 내용이 모든 사람의 PHP 프로그램 설계에 대한 특정 참조 가치를 가지고 있다고 믿습니다.