본문 바로가기
Programming

[PHP] unset()의 묘한 함정

by BitSense 2009. 1. 6.
반응형

unset은 프로그램 중에 사용하던 변수를 해제(unset)하여 사용 중인 메모리를 반환하는
일종의 java 등에서 말하는 가비지 콜렉션의 역할을 합니다.

때문에, 메모리가 많이 소비되는 대용량 처리 등에서는 꼭! 사용해야할 함수입니다.

문제는 unset이란 명령을 php는 꼭 처리해야할 명령으로 보지 않는 것 같습니다.
무슨 말이냐면, 대용량의 데이터를 처리하는 경우,
간혹 해당 변수를 비웠다? 치고 진행하는 경우가 있습니다.

얼마전 데이터 수집 프로그램을 작성 중에 db에 들어간 데이터가 꼬인 적이 있습니다.

증상은, 간혹 몇개의 데이터가 이전 데이터랑 동일한 정보로 들어간다는 것입니다.
그 중복으로 들어간 데이터는 해당 변수를 변환 처리 후에 분명 unset($data); 으로 해제를 했습니다.

왜 그러나.. 하고 분석을 하던 중에 발견한 사항은
해당 $data 값에 들어가는 값이 null 일 경우, 이전 데이터가 부활? 한다는 것입니다.

이 말은 unset으로 해당 변수를 우리는 분명히 파괴되었다(destroyed) 고 믿고 있지만,
실상 php는 해당 자료를 unset 하는 작업을 곧바로 진행하지 않는 다는 것입니다.

작업량이 많을 경우 php는 unset과 같은 몇몇 명령을 우선순위에서 뒤로 미루고,
여유가 생길때? 메모리를 해제 하는 것 같습니다.

물론 프로그램이 종료 되는 경우에는 전체 메모리를 반환하기 때문에, 잘 되어야 맞구요.

이럴 경우에는 강제로 변수를 엎어야 합니다.
$data = ""; 같은 것으로 말이죠. ^^;;
반응형