PHP 변수 및 메모리 관리에 대한 연구 노트

高洛峰
풀어 주다: 2023-03-06 14:54:02
원래의
1409명이 탐색했습니다.

1. memory_get_usage 함수

int memory_get_usage ([ bool $real_usage = false ] )


PHP 스크립트에서 사용하는 메모리(memory_get_usage() 제외) 함수 자체가 차지하는 메모리)

memory_get_usage()의 $real_usage 매개변수의 기본값은 FALSE입니다. TRUE로 설정하면 얻은 메모리 값은 PHP 메모리 관리가 차지하는 메모리입니다.

//php分配到的内存
var_dump(memory_get_usage(true));
//php使用内内存
var_dump(memory_get_usage());
로그인 후 복사

결과

int 262144
int 239368


PHP의 메모리 관리 메커니즘은 다음과 같습니다. Store 변수로, 공간이 부족할 경우 새로운 공간을 신청하세요.

memory_get_usage(true)는 사전 할당된 메모리입니다.


이전에는 PHP 페이지의 메모리 사용량에 대해 관심을 가져본 적이 없습니다. 이 기능은 앞으로 페이지를 최적화할 때 코드 분석에도 사용해야 합니다.


2. 변수 할당 및 메모리

var_dump(memory_get_usage());
 
$a = "Hello World";
var_dump(memory_get_usage());
 
$b = $a;
var_dump(memory_get_usage());
 
unset($b);
var_dump(memory_get_usage());
 
unset($a);
var_dump(memory_get_usage());
로그인 후 복사

결과

int 239776
int 239912
int 240000
정수 239912
정수 239776


239912-239776=136

240000-239912=88


$a와 $b 할당에 사용되는 메모리가 다릅니다. 그 이유는 $b 할당이 출력 함수에 의해 메모리를 할당하지 않기 때문입니다.

또한 $b를 소멸해도 $a가 사용하는 메모리에는 영향을 주지 않습니다. 이것이 메모리 관리 참조 카운팅의 이유입니다

변수 할당과 메모리의 관계를 명확하게 이해할 수 있습니다. 예

var_dump(memory_get_usage());
 
$a = "Hello World";
var_dump(memory_get_usage());
 
$b = "Hello World";
var_dump(memory_get_usage());
 
unset($b);
var_dump(memory_get_usage());
 
unset($a);
var_dump(memory_get_usage());
로그인 후 복사

결과

int 239816
int 239952
int 240088
int 239952
int 239816

239952-23 981 6=136

240088-239952=136


또한, 참조 할당의 메모리 점유 규칙은 직접 할당의 메모리 점유 규칙과 유사합니다. 메모리 관리의 참조 계산 규칙


3. PHP 가비지 수집 메커니즘, 이 부분은 충분히 이해되지 않았습니다. 단순히 함수를 기록합니다.

xdebug_debug_zval이 필요합니다. xdebug 확장

$a = "Hello World";
xdebug_debug_zval('a');
로그인 후 복사

출력

a:

(refcount=1, is_ref=0),string 'Hello World'(길이= 11)

refcount는 이 값의 변수 개수를 가리킵니다

is_ref는 주소 참조가 있는지 여부를 나타냅니다

Type

Value

변수에 값을 할당할 때: is_ref는 false이고 refcount는 1

수동 주소

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

http://php .net/manual/zh/features.gc.refcounting-basics.php

php 변수는 "zval"이라는 변수 컨테이너에 저장됩니다. zval 변수 컨테이너에는 변수의 유형과 값 외에 2바이트의 추가 정보가 포함되어 있습니다. 첫 번째는 "is_ref"로, 이 변수가 참조 세트에 속하는지 여부를 식별하는 데 사용되는 부울 값입니다. 이 바이트를 통해 PHP 엔진은 일반 변수와 참조 변수를 구별할 수 있습니다. PHP에서는 사용자가 &를 사용하여 사용자 정의 참조를 사용할 수 있으므로 zval 변수 컨테이너에는 메모리 사용을 최적화하는 내부 참조 계산 메커니즘도 있습니다. 두 번째 추가 바이트는 "refcount"이며, 이 zval 변수 컨테이너를 가리키는 변수(기호라고도 함)의 수를 나타내는 데 사용됩니다. 모든 기호는 기호 테이블에 존재하며, 각 기호에는 범위(scope)가 있고, 기본 스크립트(예: 브라우저를 통해 요청된 스크립트)와 각 함수나 메서드에도 범위가 있습니다.


위 내용은 PHP 변수 및 메모리 관리에 대한 연구 노트의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿