寫時複製(Copy-on-Write,也縮寫爲COW),顧名思義,就是在寫入時才真正複製一份內存進行修改。 COW最早應用在*nix系統中對線程與內存使用的優化,後面廣泛的被使用在各種編程語言中,如C++的STL等。 在PHP內核中,COW也是主要的內存優化手段。 在前面關於變量和內存的討論中,引用計數對變量的銷燬與回收中起着至關重要的標識作用。 引用計數存在的意義,就是爲了使得COW可以正常運作,從而實現對內存的優化使用。
例子1:
<?php
$a = range(0,9);
var_dump(memory_get_usage());
echo '<br />';
$b = $a;
var_dump(memory_get_usage());
echo '<br />';
$a = range(0,9);
var_dump(memory_get_usage());
echo '<br />';
看一下這個內存使用情況:
int(136104)
int(136152)
int(137104)
你仔細看,是不是最後一個比第一個大很多,第一個和第二個是不是差不多!這證明在內存中又開闢了一塊空間;
例子2:
<?php
$a = range(0,9);
var_dump(memory_get_usage());
echo '<br />';
$b = &$a;
var_dump(memory_get_usage());
echo '<br />';
$a = range(0,9);
var_dump(memory_get_usage());
echo '<br />';
看一下這個內存使用情況:
int(136104)
int(136152)
int(136152)
你再仔細看,下面是不是一樣了,這就是引用的作用,不會開闢內存空間了,$a和$b共用一塊內存空間!
下面是xdebug出來的信息:
<?php
$a = range(0,2);
xdebug_debug_zval('a');
echo '<br />';
$b = &$a;
xdebug_debug_zval('a');
echo '<br />';
$a = range(0,2);
xdebug_debug_zval('a');
a:
(refcount=1, is_ref=0),
array (size=3)
0 => (refcount=1, is_ref=0),int 0
1 => (refcount=1, is_ref=0),int 1
2 => (refcount=1, is_ref=0),int 2
a:
(refcount=2, is_ref=1),
array (size=3)
0 => (refcount=1, is_ref=0),int 0
1 => (refcount=1, is_ref=0),int 1
2 => (refcount=1, is_ref=0),int 2
a:
(refcount=2, is_ref=1),
array (size=3)
0 => (refcount=1, is_ref=0),int 0
1 => (refcount=1, is_ref=0),int 1
2 => (refcount=1, is_ref=0),int 2
refcount 指向該空間的變量數,is_ref是不是引用
對比下面不是引用變量的
a:
(refcount=1, is_ref=0),
array (size=3)
0 => (refcount=1, is_ref=0),int 0
1 => (refcount=1, is_ref=0),int 1
2 => (refcount=1, is_ref=0),int 2
a:
(refcount=2, is_ref=0),
array (size=3)
0 => (refcount=1, is_ref=0),int 0
1 => (refcount=1, is_ref=0),int 1
2 => (refcount=1, is_ref=0),int 2
a:
(refcount=1, is_ref=0),
array (size=3)
0 => (refcount=1, is_ref=0),int 0
1 => (refcount=1, is_ref=0),int 1
2 => (refcount=1, is_ref=0),int 2
安裝xdebug,https://blog.csdn.net/qq_35770969/article/details/80757959