2012-03-02 3 views
1

누구든지이 간단한 질문에 대답 할 수 있는지 궁금합니다. 나는 그것을 검색해 보았지만 비슷한 질문을하지만 틀린 맥락에서 나온다. 함수가 끝난 후 $ test_array 어떻게됩니까PHP 함수 변수 및 가비지 컬렉터

function foo() 
{ 
    $test_array = array(); 
    for($i=0; $i<10000000; $i++) 
    { 
     $test_array[] = $i; 
    } 
} 

: 나는 궁금 무엇

이 코드를 가지고있다. 나는 그것이 범위를 잃어 버린다는 것을 안다. 나는 프로그래밍에 익숙하지 않다.

나는 함수가 종료되거나 함수가 끝나는대로 PHP가 가비지 컬렉터에 삭제를 설정 않습니다 전에 내가

unset($test_array); 

를 호출해야 무엇을 궁금?

저는 for 루프를 사용하여 요점을 파악하기에 적합한 크기의 변수를 보여줍니다. 가비지 수집을 받았습니다, 케빈

답변

3

를 읽기위한

덕분에 일단 test_array이 범위에 더 이상 $ 없다 (그리고 가리 추가 언급은 없다). 프로세스가 함수에서 호출 루틴으로 돌아갈 때 범위에서 벗어납니다. 따라서 설정을 해제 할 필요가 없습니다. 이것은 $ test_array를 static으로 선언했다면 달라질 것입니다.

+0

'memory_get_usage()'에 대한 내 자신의 테스트에서 (아마도 매우 특정 플랫폼에 특화되어 있으므로 소금 한알 가지고) - 변수를 명시 적으로 설정 해제하면 메모리가 즉시 해제됩니다. 변수 범위를 벗어나게하면 변수를 수집 할 수있는 플래그로 표시하지만 콜렉터 자체가 반드시 트리거되는 것은 아닙니다. – gregheo

+0

unset()은 삭제하지 않고, 단지 삭제 플래그를 설정하고, unset() 또는 호출 루틴으로 돌아가서 가비지 수집을 트리거하지 않습니다. Coder가 말했듯이, CPU에 여유 시간이 있거나 PHP가 추가 메모리를 할당하려 할 때 필요가 충분하지 않을 때 발생합니다. –

+0

내가 아는 한, unset은 가비지 콜렉터를 호출하지 않는다. –

0

unset()은 변수가 사용하는 메모리를 해제하지 않으며 메모리를 해제 할시기를 결정하는 가비지 수집기를 표시합니다. 무료 cpu주기 또는 메모리가 부족한 경우 중 빠른 날짜).

그러나 대부분의 시간이 밀리 초 단위로 측정되는 스크립트가 끝나면 PHP 스크립트에서 사용되는 모든 메모리가 해제된다는 것을 알아야합니다. 따라서 " PHP 스크립트의 "정상적인"실행 시간은 메모리를 확보하는 것에 대해 걱정할 필요가 없습니다.

+0

스크립트가 실행 된 후에 메모리가 해제된다는 것을 알고 있지만 정리 된 관리 코드는 약간의 항문이다. –