>백엔드 개발 >PHP 문제 >PHP 가비지 수집 메커니즘이란 무엇입니까?

PHP 가비지 수집 메커니즘이란 무엇입니까?

(*-*)浩
(*-*)浩원래의
2019-09-24 09:17:143893검색

PHP 가비지 수집 메커니즘이란 무엇입니까?

PHP 가비지 수집 메커니즘(가비지 수집기, GC라고 함) PHP에서는 이 객체를 가리키는 변수가 없으면 이 객체는 가비지가 됩니다.

PHP는 메모리에서 이를 파괴합니다. 이는 메모리 오버플로를 방지하기 위한 PHP의 GC 가비지 처리 메커니즘입니다. PHP 스레드가 종료되면 현재 점유된 모든 메모리 공간이 소멸되고 동시에 현재 프로그램의 모든 객체가 소멸됩니다. (추천 학습: 입력부터 마스터까지의 PHP 프로그래밍)

GC 프로세스는 일반적으로 각 SESSION에서 실행을 시작합니다. .gc의 목적은 세션 파일이 만료된 후 자동으로 실행되는 것입니다.

__destruct /unset __destruct 소멸자는 가비지 객체가 재활용될 때 실행됩니다.

unset은 객체가 아닌 객체를 가리키는 변수를 삭제합니다.

세션 및 PHP 가비지 수집 메커니즘 PHP의 작동 메커니즘으로 인해 세션 정보를 정기적으로 스캔하여 유효한 요청인지 확인하는 데몬 스레드가 없습니다. 문제가 발생하면 PHP는 전역 변수 session.gc_probability 및 session.gc_divisor의 값을 기반으로 GC를 활성화할지 여부를 결정합니다.

기본적으로 session.gc_probability=1, session.gc_divisor =100은 GC 시작 가능성이 1%라는 것을 의미합니다(즉, 요청 100개 중 단 하나의 GC만 있음을 의미합니다). 100개의 요청 중 하나로 시작됨)

PHP 가비지 수집 메커니즘의 작업은 모든 세션 정보를 스캔하고 세션과 동일하게 현재 시간에서 세션의 마지막 수정 시간을 빼는 것입니다. .gc_maxlifetime 매개변수 비교, 생존 시간이 gc_maxlifetime(기본값 24분)을 초과하면 세션이 삭제됩니다.

그러나 웹 서버에 여러 사이트가 있는 경우 GC는 여러 사이트에서 세션을 처리할 때 예상치 못한 결과가 발생할 수 있습니다. 그 이유는 GC가 세션 작업 시 서로 다른 사이트를 구분하지 않기 때문입니다.

그럼 이때는 어떻게 해결해야 할까요?

session.save_path를 수정하거나 session_save_path를 사용하여 각 사이트의 세션을 전용 디렉터리에 저장합니다.

GC 시작 속도 제공, 당연히 PHP 가비지 재활용 메커니즘의 활성화 속도가 증가하면 그에 따라 시스템 성능이 저하되므로 권장되지 않습니다.

코드에서 현재 세션의 생존 시간을 확인하고 session_destroy를 사용하여 삭제합니다.

참조 카운팅에 대한 기본 지식

각 PHP 변수는 "zval"이라는 변수 컨테이너에 존재합니다. 포함하는 변수의 유형과 값에는 2바이트의 추가 정보도 포함됩니다.

첫 번째는 "is_ref"로, 이 변수가 참조 세트(참조 세트)에 속하는지 식별하는 데 사용되는 부울 값입니다. ) . 이 바이트를 통해 PHP 엔진은 일반 변수와 참조 변수를 구별할 수 있습니다. PHP에서는 사용자가 &를 사용하여 사용자 정의 참조를 사용할 수 있으므로 zval 변수 컨테이너에는 메모리 사용을 최적화하는 내부 참조 계산 메커니즘도 있습니다. 바이트는 이 zval 변수 컨테이너를 가리키는 변수(기호라고도 함)의 수를 나타내는 데 사용되는 "refcount"입니다.

변수에 상수 값이 할당되면 zval 변수 컨테이너가 됩니다. 다음 예에서는

<?php
$a = "new string";
?>

위 예에서 새 변수는 현재 범위에서 생성된 a이고 유형은 문자열이고 값은 "new string" " 변수 컨테이너입니다. 추가 2바이트 정보에서는 사용자 정의 참조가 생성되지 않으므로 "is_ref"는 기본적으로 false로 설정됩니다. 이 변수를 사용하는 변수는 하나만 있으므로 "refcount"는 1로 설정됩니다. 내용:

<?php
$a = "new string";
xdebug_debug_zval(&#39;a&#39;);
?>

위 코드는 다음을 출력합니다:

a: (refcount=1, is_ref=0)=&#39;new string&#39;

위 내용은 PHP 가비지 수집 메커니즘이란 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.