그래서 메모리에 민감한 데이터 (많은 양의 데이터)를 처리하는 장기 실행 스크립트를 실행하고 있습니다. 나는 생각한다. 나는 장기간의 진행 과정에서 큰 물체를 적절하게 파괴하고, 기억을 보존하는 좋은 일을하고있다.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)
귀하의 스크립트를 보여주십시오 – hek2mgl
TRUE 인수가 있거나 없거나 memory_get_usage()를 호출하고 있습니까? 꽤 다른 점이 있습니다 : TRUE 인수를 사용하면 emalloc을 사용하여 요청 된 실제 메모리가 반환됩니다. FALSE 인수는 사용 된 메모리 블럭을 보여줍니다. –
@MarkBaker 둘 다. – Kovo