2013-07-23 3 views
1

그래서 메모리에 민감한 데이터 (많은 양의 데이터)를 처리하는 장기 실행 스크립트를 실행하고 있습니다. 나는 생각한다. 나는 장기간의 진행 과정에서 큰 물체를 적절하게 파괴하고, 기억을 보존하는 좋은 일을하고있다.PHP 메모리 할당 및 할당 해제

현재 메모리 사용량 (memory_get_usage() 사용)을 지속적으로 출력하는 로그가 있으며 메모리 사용량에 상승 및 하락 (중요 함)을 알지 못합니다. 이것은 아마도 메모리 관리에있어 옳은 일을하고 있다고 말합니다.

그러나 서버에 로그온하여 top 명령을 실행하면이 스크립트를 처리하는 아파치 프로세스가 메모리를 할당 해제하지 않는다는 것을 알 수 있습니다 (적어도 top 명령을 통해 눈에 띄게 표시됨). PHP가보고 한 현재 메모리 사용량이 훨씬 적을지라도 가장 높은 메모리 사용량을 유지합니다.

내 질문은 : 메모리를 실제로 서버로 다시 보내지 않으면 메모리를 쓸데없는 노력을하고 있습니까? 또는 나는 여기에서 무엇인가 놓치고있다.

감사합니다.

ps. 리눅스에서 PHP 5.4를 사용하여

pps.) hek2mgl가 권장하는대로, 내가 debug_zval_dump을 (실행, 출력은 나에게, 올바른 것 같다

function bigData() 
{ 
    $obj = new BigDataObj(); 
    $obj->loadALotOfData(); 

    $varA = $obj->getALotOfData(); 

    //all done 
    $obj = NULL; 
    $varA = NULL; 
    unset($obj,$varA); 
} 

업데이트 : 코드를 원하는 사람들을 위해,이 기본적인 표현입니다.

function bigData() 
{ 
    $obj = new BigDataObj(); 
    $obj->loadALotOfData(); 

    //all done 
    $obj = NULL; 

    debug_zval_dump($obj); 

    unset($obj); 

    debug_zval_dump($obj); 
} 

출력 :

NULL refcount(2) 

NULL refcount(1) 
+0

귀하의 스크립트를 보여주십시오 – hek2mgl

+1

TRUE 인수가 있거나 없거나 memory_get_usage()를 호출하고 있습니까? 꽤 다른 점이 있습니다 : TRUE 인수를 사용하면 emalloc을 사용하여 요청 된 실제 메모리가 반환됩니다. FALSE 인수는 사용 된 메모리 블럭을 보여줍니다. –

+0

@MarkBaker 둘 다. – Kovo

답변

1

PHP는 가비지 컬렉터를 갖는다. 참조 카운트가 0으로 설정된 변수 컨테이너의 메모리를 비울 것입니다. 이는 더 이상 사용자 랜드 참조가 없음을 의미합니다.

나는 당신이 청소했다고 생각할 수도있는 변수에 대한 참조가 있다고 생각합니다. 문제가 무엇인지 보여주기 위해 코드를 볼 필요가 있습니다.

+0

PHP는 get_memory_usage() 출력에서 ​​알 수 있듯이 가비지를 잘 수집하는 것처럼 보입니다. 나는이 객체가 더 이상 참조되지 않는다는 것을 알고있다. 왜냐하면 많은 객체가 생성되고 함수 내부에서 파괴되기 때문이다. – Kovo

+0

가비지 수집기가 버그라고 말 했나요? 'debug_zval_dump ($ object)'를 사용하여 참조가 없는지 확인하십시오. – hek2mgl

+0

나는 그것이 버그라고 말하지 않았다 : p 버그는 무엇인지 전혀 알지 못한다. 그리고 예상 된 행동 만 관찰했다. 아프다. – Kovo