PHP寫時複製(Copy On Write)

從一個例子提及: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(寫時複製)。segmentfault

寫時複製應用場景

寫時複製(Copy on Write,也縮寫爲COW)的應用場景很是多, 好比Linux中對進程複製中內存使用的優化,在各類編程語言中,如C++的STL等等中均有相似的應用。 COW是經常使用的優化手段,能夠歸類於:資源延遲分配。只有在真正須要使用資源時才佔用資源, 寫時複製一般能減小資源的佔用。設計模式

一個證實 PHP COW 優化內存佔用的例子:安全

<?php
$j = 1;
var_dump(memory_get_usage());
 
$tipi = array_fill(0, 100000, 'php-internal');
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 . php
int(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。


clipboard.png

講堂報名地址:https://segmentfault.com/l/15...

PHP筆試面試題精選(二)

課程簡述

《PHP筆試面試題精選》課程系列分享關於 PHP 筆試面試會問到的一些問題和知識點,圍繞 PHP、數據庫、計算機網絡、計算機操做系統、設計模式、WEB安全等多個方面進行。

課程內容

因爲涉及到的問題和知識點比較多,本期主要講 PHP基礎、WEB安全、計算機網絡三個方面有關的問題。

PHP基礎方面

  • PSR規範
  • PHP新特性
  • PHP_FPM性能調優
  • Session垃圾回收機制

WEB安全

  • XSS攻擊原理和防範
  • CSRF攻擊原理和防範
  • SQL注入攻擊防範
  • 密碼哈希

計算機網絡

  • HTTP協議
  • TCP/IP協議
  • WebSocket鏈接過程
相關文章
相關標籤/搜索