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 버전이 문제인 것인지 특정 환경에서 발생하는 건지 잘 모르겠습니다...
'PHP' 카테고리의 다른 글
[PHP] strrpos 함수의 offset 인자 (0) | 2016.09.08 |
---|---|
[PHP] 문자를 hex로 바꾸고 다시 복구하기 (0) | 2016.08.29 |
[PHP] AES128/ECB 복호화 하기 (0) | 2016.08.29 |
[PHP] php-mcrypt 모듈 설치하기 (0) | 2016.08.25 |