首頁 > 後端開發 > php教程 > PHP寫時複製詳解

PHP寫時複製詳解

小云云
發布: 2023-03-22 14:00:02
原創
2248 人瀏覽過

本文主要和大家分享PHP寫時複製詳解,我們先從一個例子說起,希望能幫助大家。

<?php$foo = 1;
$bar = $foo;echo $foo + $bar;
登入後複製

變數 $foo 賦值給變數 $bar,這兩個變數具有相同的值,沒有必要新申請記憶體空間,他們可以共享同一塊記憶體。 在許多場景下PHP 的 COW 對記憶體進行最佳化。例如:變數的多次賦值、函數參數傳遞,並在函數體內修改實參等。

什麼是「複製」

這是一段摘自鳥哥部落格的例子,說的比較清楚,就直接貼過來了。

<?php
   $var = "laruence";
   $var_dup = $var;
   $var = 1;?>
登入後複製

很明顯在這段程式碼執行以後,$var_dup 的值應該還是」laruence」, 那麼這又是怎麼實現的呢?這就是PHP 的copy on write 機制:

PHP 在修改一個變數以前,會先查看這個變數的refcount,如果refcount 大於1,PHP 就會執行一個分離的例程, 對於上面的程式碼,執行到第三行的時候,PHP 發現$var 指向的zval 的refcount 大於1,那麼PHP 就會複製一個新的zval 出來,將原zval 的refcount 減1,並修改symbol_table,使得$var 和$var_dup分離(Separation)。這個機制就是所謂的 copy on write(寫時複製)。

寫時複製應用程式場景

寫時複製(Copy on Write,也縮寫為COW)的應用場景非常多, 例如Linux中對進程複製中記憶體使用的最佳化,在各在種程式語言中,如C++的STL等等中均有類似的應用。 COW是常用的最佳化手段,可以歸類於:資源延遲分配。只有在真正需要使用資源時才佔用資源, 寫時複製通常能減少資源的佔用。

一個證明 PHP COW 最佳化記憶體佔用的例子:

<?php
$j = 1;
var_dump(memory_get_usage());
 
$tipi = array_fill(0, 100000, &#39;php-internal&#39;);
var_dump(memory_get_usage());
 
$tipi_copy = $tipi;
var_dump(memory_get_usage());
 
foreach ($tipi_copy as $i) {
    $j += count($i);
}
var_dump(memory_get_usage());
登入後複製

運行結果:

$ php t . phpint(630904)int(10479840)int(10479944)int(10480040)
登入後複製

記憶體並沒有顯著提高。

「寫入時複製」的原理

多個相同值的變數共用同一塊記憶體的確節省了記憶體空間,但變數的值是會改變的,如果在上面的例子中, 指向同一記憶體的值發生了變化(或可能發生變化),就需要將變化的值「分離」出去,這個「分離」的操作, 就是「複製」。

在PHP中,Zend引擎為了區別同一個zval位址是否被多個變數共享,引入了ref_count和is_ref兩個變數進行識別:

ref_count和is_ref是定義於zval結構體中

is_ref標識是不是使用者使用& 的強制引用;

ref_count是引用計數,用於標識此zval被多少個變數引用,即COW的自動引用,為0時會被銷毀;

註:由此可見, $a=$b; 與$a=&$b; 在PHP對記憶體的使用上沒有區別(值不變化時);

相信大家也可以了解到PHP中COW的實現原理: PHP 中的COW 基於引用計數ref_count 和is_ref 實現, 多一個變量指針,就將ref_count 加1, 反之減去1,減去0 就銷毀; 同理,多一個強制引用&,就將is_ref 加1,反之減去1。

相關推薦:

總結寫時複製的實例用法教學

PHP中的寫時複製(Copy On Write)的程式碼實例分享

php變數的引用計數器和寫入時複製

#

以上是PHP寫時複製詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板