首頁 >後端開發 >php教程 >PHP變數和記憶體管理的學習筆記

PHP變數和記憶體管理的學習筆記

高洛峰
高洛峰原創
2017-03-12 13:38:471418瀏覽

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的記憶體管理機制是:預先分配一塊空間,用來儲存變數,當空間不夠時,再申請一塊新的空間。

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
# int 239912
int 239776


239912-239776=136

240000-239912=88


$a和$b賦值所使用的記憶體不同,原因是$b賦值並沒有分配內存,這88個位元組是輸出函數佔用的。

另外銷毀$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-239816

##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' (length=11)

refcount 指向該值的變數數量

is_ref 代表是否有位址引用

類型


變數賦值的時候:is_ref為false  refcount為1

手冊位址

引用計數的基本知識

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

#每個

php變數存在一個叫做"zval"的變數容器中。一個zval變數容器,除了包含變數的類型和值,還包括兩個位元組的額外資訊。第一個是"is_ref",是個bool值,用來識別這個變數是否是屬於引用集合(reference set)。透過這個位元組,php引擎才能把普通變數和引用變數區分開來,由於php允許使用者透過使用&來使用自訂引用,zval變數容器中還有一個內部引用計數機制,來優化記憶體使用。第二個額外位元組是"refcount",用以表示指向這個zval變數容器的變數(也稱為符號即symbol)個數。所有的符號存在一個符號表中,其中每個符號都有作用域(scope),那些主腳本(例如:透過瀏覽器請求的的腳本)和每個函數或方法也都有作用域。   


以上是PHP變數和記憶體管理的學習筆記的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn