1. 程式人生 > 實用技巧 >php進階(二)—php寫時複製

php進階(二)—php寫時複製

  在php的記憶體管理中有一個很重要的概念就是寫時複製(Copy on write),話不多說直接來程式碼

<?php
$a = [];
$index = 0;
while(true){
        $a [] = rand(1, 100);
        if(++$index == 1000000){
break;
}
}
$b = $a;
echo date('H:i:s') , ' Current memory usage: ' , (memory_get_usage(true) / 1024 / 1024) , " MB";

  首先定義一個10萬隨機資料的陣列a,並定義一個變數b,使得b等於a,這時打印出記憶體佔用情況,記憶體佔用大約為34MB

  接下來見證奇蹟的時刻,在上面的程式碼中加一行程式碼,隨意修改b陣列中的一個值

<?php
$a = [];
$index = 0;
while(true){
        $a [] = rand(1, 100);
        if(++$index == 1000000){
break;
}
}
$b = $a;
$b[0] = 1000;
echo date('H:i:s') , ' Current memory usage: ' , (memory_get_usage(true) / 1024 / 1024) , " MB";

  這時再檢視記憶體佔用情況,輸出結果如下,記憶體為66MB,幾乎是上面執行結果的兩倍。

  從上面的程式碼示例,下面引出php寫實複製的概念,

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

  PHP中的COW可以簡單描述為:如果通過賦值的方式賦值給變數時不會申請新記憶體來存放 新變數所儲存的值,而是簡單的通過一個計數器來共用記憶體,只有在其中的一個引用指向變數的 值發生變化時才申請新空間來儲存值內容以減少對記憶體的佔用。 在很多場景下PHP都COW進行記憶體的優化。比如:變數的多次賦值、函式引數傳遞,並在函式體內修改實參等。