질문Q #8081
db library 에서 save_queries 옵션에 대한 팁
pithecus2012-03-29 22:39:12
ci 로 db 입출력 작업을 하는 daemon 을 개발하는 중에
실행시간이 지날 수록 메모리 사용량이 계속 늘어나더군요. 

while(true):
  $sql = "~~~";
  $this->db->query($sql);
endwhile; 

어디선가 메모리 leak 이 있나해서 찾아보다 보니
db library 의 query 에서 발견한 점 하나 공유드립니다.

db library 에 보면 save_queries 라는 옵션이 있습니다.
db->last_query() 및 profiler 에서 성능측정을 하기 위해서
이 옵션이 true 이면 db->query() 에서 실행한 sql 문자열을 전부 저장을 하더군요.

일반적인 웹페이지의 경우 response 를 하면 자동으로 종료가 되니 문제가 없겠지만
daemon 등의 loop 구조 또는 대량의 자료처리를 할 경우에는 얼마 지나면 php 가 멈춰버립니다 :)

ci user guide 에는 save_queries 옵션 설정에 대한 내용은 없어서 좀 헤멨네요.
$this->db->save_queries = FALSE 
으로 코드상에 넣거나
database config 에 $config["save_queries"] = FALSE 를 설정해도 됩니다.
(config 에 넣을 경우에는 db->last_query() 등 연관된 기능은 사용못하겠죠.)

더 궁금하신게 있으면 여기를 참조하시기 바랍니다.
http://www.greeneggmedia.com/blog/entry/undocumented-codeigniter 
ci reactor 에 수정요청은 올라가 있는데 언제 반영될지는 모르겠네요.

답변3
#1 한대승(불의회상) 2012-03-30 11:28:19
좋은 정보 감사 합니다.

cron 이나 daemon 종류라면 DB작업이 주가 될것 같습니다.
로직이 복잡 하지 않다면 CI를 사용하지 않는 방법도 대안이 될것 같습니다. ^^
#2 민상k 2012-05-22 13:56:47
cron 에 넣어둔 크롤러가 자주 죽어서 원인을 살펴보고 있었는데 이 문제일 수도 있을 것 같군요.
한번 넣어봐야겠어요ㅋ
#3 민상k 2012-05-22 14:23:55
알려주신 부분에 더하여,
길게 쓴 배열들 unset 하고, 주기적으로 라이브러리 재로드 하는 부분을 넣었더니 아직까지 안 죽고 잘 동작하네요ㅋ
좋은 정보 감사드립니다.