본문 바로가기

PHP

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

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 버전이 문제인 것인지 특정 환경에서 발생하는 건지 잘 모르겠습니다...