PHP에서 쓰레기 수거 관련 함수 사용

이전에 우리는 PHP의 인용 계수와 쓰레기 회수 메커니즘의 개념을 배운 적이 있다.이런 내용은 매우 이론적이고 흔히 볼 수 있는 면접 내용이다.오늘 소개한 것은 쓰레기 회수에 관한 구체적인 기능 함수입니다.이전의 두 편의 소개 문장에 관해서는 모두들 문장 밑에 가서 볼 수 있다.

순환 인용 및 순환 인용 강제 정리


우리는 왜 순환 인용을 강조해야 합니까?사실, 기본적으로 우리는 다른 변수에 인용되지 않은 변수를 unset () 로 직접 떨어뜨릴 때, 이 변수의 인용 계수를 0으로 바꿉니다.이때 PHP의 기본 쓰레기 수거 메커니즘은 이 변수를 직접 제거합니다.예:

$a = new stdClass;
$b = new stdClass;
$c = new stdClass;
echo memory_get_usage(), PHP_EOL; // 706528

unset($a);
echo memory_get_usage(), PHP_EOL; // 706488

gc_collect_cycles();
echo memory_get_usage(), PHP_EOL; // 706488
위의 코드에서 알 수 있듯이 우리 unset () 가 $a를 떨어뜨린 후에 메모리가 바로 줄어들었다.그러나 순환 인용이 발생한 경우 unset () 를 간단하게 진행하면 효과가 없습니다.

class D{
    public $d;
}
$d = new D;
$d->d = $d;
echo memory_get_usage(), PHP_EOL; // 706544

unset($d);
echo memory_get_usage(), PHP_EOL; // 706544

gc_collect_cycles();
echo memory_get_usage(), PHP_EOL; // 706488
이 코드에서, 우리는\$d에 대해 간단한 순환 인용 값을 부여했다.unset () 를 사용한 후 메모리가 변하지 않았습니다. 이때 gc_만 사용할 수 있습니다collect_cycles () 함수로 강제 순환 인용 정리를 해야 $d의 잘못된 순환 인용을 삭제할 수 있습니다.
맞아, 이 단락의 중점은 바로 gc_collect_cycles () 함수입니다.이것은 정상적인 상황에서 일반적인 변수에 대한 인용은 정리 효과가 없을 것이다. 물론 일반적인 변수에 대해서는 우리가 직접 unset () 를 제거하면 된다.그것의 가장 주요한 역할은 순환 인용에 대한 정리이다.이전에 우리가 배운 바와 같이, 순환 인용 계수는 루트 버퍼가 존재하는데, 일반적으로 기본적으로 정리할 수 있는 10000개의 루트를 수용할 수 있다.반면 gc_collect_cycles () 의 역할은 이 버퍼가 가득 차면 직접 정리하지 않는 것이다.이 쓰레기 회수 알고리즘에 대한 내용은 다음으로 이동하십시오PHP 쓰레기 회수 메커니즘에 대한 얕은 이해
사실, 대부분의 경우 우리는 PHP의 쓰레기 회수 문제에 그다지 관심을 가질 필요가 없다. 즉, 우리는 수동으로 이 gc_를 호출할 필요가 없다.collect_cycles () 함수입니다.PHP-FPM은 호출이 완료될 때마다 전체 방출이 이루어지며 간단한 CLI 스크립트 한 번 실행이 끝나면 모두 방출됩니다.맞아요. 정상적인 상황에서 PHP는 한 번에 실행이 끝나면 모든 내용을 없애고 메모리 쓰레기도 존재하지 않습니다.그러나 오랫동안 스크립트를 지킬 때나 프로세스에 상주하는 프레임워크(Swoole)를 사용할 때는 순환 참조가 있는지 주의해야 한다.이런 프로그램이 계속 실행되기 때문에 대량의 순환 인용 대상이 존재할 때 메모리 유출을 초래할 수 있다.

순환 인용 쓰레기 회수 상태 열기, 닫기 및 보기


gc_disable();
echo gc_enabled(), PHP_EOL; //
gc_enable();
echo gc_enabled(), PHP_EOL; // 1
아주 간단한 세 함수, gc_disable () 은 순환 참조 컬렉터 비활성화, gc_enable () 은 "루프 참조 컬렉터 열기"이고 gc_enabled () 는 현재 순환 인용 수집기가 켜져 있는지 확인하는 것입니다.

Zend 엔진 메모리 관리자에서 사용한 메모리 강제 회수


gc_mem_caches()
홈페이지와 인터넷에는 상세한 소개가 없지만 정의를 보면 PHP 밑에 있는 Zend 엔진 메모리 관리자가 사용한 메모리를 회수하는 것이 주요 역할이다.이것을 모두가 알아두면 돼, 평소에도 여태껏 써 본 적이 없어.

쓰레기 수집기 정보 얻기


$e = new stdClass;
for($i = 100;$i>0;$i--){
    $e->list[] = $e;
}

unset($e);
gc_collect_cycles();

var_dump(gc_status());
// array(4) {
//     ["runs"]=>int(1)
//     ["collected"]=>int(2)
//     ["threshold"]=>int(10001)
//     ["roots"]=>int(0)
// }
우리는 순환 인용 대상을 만들고 gc_를 사용했다status () 는 현재 쓰레기 수거기에서 순환 인용에 대한 상태를 표시합니다.되돌아오는 내용에서 알 수 있듯이runs는 1개를 실행했고,collected는 2개를 수집했으며,threshold 한도값은 10001이고,roots는 루트가 없을 수도 있습니다. (회수되었습니다.)
이 함수는 테스트 환경에서 코드의 운행 상황을 검사하고 우리 코드에 비정상적인 순환 인용 상황이 있는지 확인할 수 있다. 물론 위의 해석도 개인의 추측일 뿐이다. 왜냐하면 이 방면에 관한 자료가 확실히 매우 적기 때문이다.그래서 이 부분도 깊이 연구해 본 대신님이 댓글을 남겨주시길 바랍니다!!

테스트 코드:


github.com/zhangyue050…

관련 문장


//www.jb51.net/article/210943.htm
//www.jb51.net/article/210957.htm
다음은 PHP에서 쓰레기 수거 관련 함수의 사용에 대한 상세한 내용입니다. PHP에서 쓰레기 수거 관련 함수에 대한 더 많은 자료는 저희 다른 관련 글을 주목해 주십시오!

좋은 웹페이지 즐겨찾기