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에서 쓰레기 수거 관련 함수에 대한 더 많은 자료는 저희 다른 관련 글을 주목해 주십시오!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
laravel에 yo에서 angularJs&coffeescript를 사용할 수 있도록 한다.먼저 yo 명령을 사용할 수 있어야하므로 아래에서 설치 global에 설치한 곳에서 laravel의 프로젝트 루트로 이동. 클라이언트 코드를 관리하는 디렉토리를 만들고 이동합니다. 클라이언트 환경 만들기 이것으로 히...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.