2011-02-03 3 views
0

여러 CLI 데몬에서 PHP + Zend Framework를 사용하고 있습니다. 그들은 많은 기억을 가지고 있습니다. 젠드 프레임 워크 (Zend Framework)가이 문제의 원인이 될 수 있다고 추측하고 있지만 메모리가 낭비되는 곳을 보여주는 사실을 원합니다.PHP CLI - 내 메모리가 낭비되는 곳을 감지하십시오.

메모리가 낭비되는 위치를 어떻게 확인할 수 있습니까? 이것은 단지 재판 + 오류 과정입니까? 또한 어떻게하면 가비지 수집을 향상시킬 수 있습니까 (큰 메모리 사용으로 인해 문제가 될 수있는 기사를 읽었습니다).

+1

이 질문을보십시오 : http://stackoverflow.com/questions/4286193/track-memory-usage-of-a-method –

답변

1

XDebug의 프로파일 러를 사용하는 것이 좋습니다. 그러면 필요한 답변을 얻을 수 있습니다.

프로파일 러는 cachegrind 파일을 생성합니다.이 파일은 KCacheGrind와 같은 도구에서 볼 수있어 프로그램의 병목 현상 및 메모리 사용법을 확인할 수 있습니다.

XDebug가의 프로파일 페이지에 더 많은 찾기 : 실행중인 PHP 버전은 무엇 http://www.xdebug.org/docs/profiler

+0

프로필 작성자에게 프로필 소비 시간이 아닌 프로필 소비 시간 만 알릴 수 있습니다. ? –

+0

@Sebastian Hoitz, http://xdebug.org/docs/execution_trace - it (xdebug)도 메모리 소비량을 추적 할 수 있습니다. – binaryLV

0

? PHP> = 5.3 만 괜찮은 가비지 수집기가 있습니다. PHP < = 5.2는 데몬 스크립트를 실행할 때 모든 메모리를 사용할 수 있습니다.

+0

반드시 그렇지는 않습니다 - 객체가 isloated 참조에 문제가있는 경우에만 (객체가 특히 좋지 않습니다. 배열에 대해서도 같은 문제가 발생합니다.) – symcbean

+0

5.3 "원형 기준 검출기"만 추가하십시오. GC의 나머지 부분은 동일합니다 – KingCrunch

+0

제 경험상 PHP 5.2 데몬 프로세스가 모든 메모리를 먹게하는 데 엄청난 시간이 걸리지는 않습니다. 제 경우는 Zend_Queue를 기반으로 한 단순한 작업자였습니다. 객체를 제외하고 빈'while' 루프를 돌리는 경우에도 'memory_limit'에 도달하고 데몬이 스스로를 죽일 때까지 메모리를 계속 먹었습니다. PHP 5.3에서 이러한 문제는 사라졌습니다. 안타깝게도 프로덕션 서버에는 PHP 5.3이 없습니다. – Htbaa

1

IME, PHP는 코드 분석에 막대한 양의 메모리를 사용합니다. 사용중인 모든 라이브러리를 명시 적으로 포함하는 것 외에는 아무것도 수행하지 않고 시작/종료시 메모리 사용량을 추적하는 간단한 스크립트를 작성해보십시오. 이것을 실제 스크립트에서 보는 것과 비교하십시오.

Htbaa는 부분적으로 정확합니다 - PHP의 최신 버전은 더 똑똑한 가비지 컬렉터를 가지고 있지만 이전 버전은 여전히 ​​가비지 콜렉션을 수행합니다 - 새로운 GC가하는 모든 경우를 찾지 못합니다. 그러나 가비지 콜렉션 때문에 안정적인 입력 부하가 주어지면 일반적으로 메모리 사용량에 톱니 모양이 나타납니다.

좋은 가비지 콜렉션은 나쁜 코드를 수정하지 않습니다. 스택에없는 변수에 무언가를 저장했다면, 무언가를 끝내면 설정을 해제해야합니다.