PHP

[PHP] 메모리 사용량을 통해 memory leak 찾기

윤성탁 2016. 12. 20. 17:39

PHP를 배치 스크립트처럼 사용하다보니 foreach문에서 리스트 건수가 많아질 수록 서버 메모리 사용량이 올라가는 이슈를 경험했습니다.

자주 일어나는 현상은 아니었기에 당황스러워서 memory leak의 원인을 찾을 필요가 있었습니다.


버전 : PHP 5.2.5


메모리 사용량을 알려주는 함수 

memory_get_usage() : http://php.net/manual/en/function.memory-get-usage.php


사용법

ex)

의심가는 코드의 line 상하에 echo나 log로 디버깅하기 위한 준비를 하면됩니다.

foreach ($list as $item) {
    echo memory_get_usage()." Before \n";
    sample_function(); // or Call Obejct method
    echo memory_get_usage()." After \n";
}


출력

ex)

119251528 Before 
119254088 After 


loop를 수행하다보면 일정하게 유지가되는지 계속 증가하는지 확인이 가능합니다.

특히 객체나 의심스러운 변수가 있으면 unset($변수명)을 통해 진행하는게 도움이됩니다.


line마다 디버깅하다보니 memory leak이 발견된 함수가 

PHP 코어 함수인 htmlspecialchars_decode()였습니다.

- htmlspecialchars_decode() : http://php.net/manual/en/function.htmlspecialchars-decode.php


호출하지 않으면 건수에 관계 없이 메모리가 일정하지만 호출하면 메모리가 건수에 비례하여 계속 증가하는 이슈가 발생합니다.

왜 발생하는지 PHP 버전이 문제인 것인지 특정 환경에서 발생하는 건지 잘 모르겠습니다...