PHP寫時複製詳解
本文主要和大家分享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, '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 . 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中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

熱門話題

PHP 8.4 帶來了多項新功能、安全性改進和效能改進,同時棄用和刪除了大量功能。 本指南介紹如何在 Ubuntu、Debian 或其衍生版本上安裝 PHP 8.4 或升級到 PHP 8.4

Visual Studio Code,也稱為 VS Code,是一個免費的原始碼編輯器 - 或整合開發環境 (IDE) - 可用於所有主要作業系統。 VS Code 擁有大量針對多種程式語言的擴展,可以輕鬆編寫

本教程演示瞭如何使用PHP有效地處理XML文檔。 XML(可擴展的標記語言)是一種用於人類可讀性和機器解析的多功能文本標記語言。它通常用於數據存儲

JWT是一種基於JSON的開放標準,用於在各方之間安全地傳輸信息,主要用於身份驗證和信息交換。 1.JWT由Header、Payload和Signature三部分組成。 2.JWT的工作原理包括生成JWT、驗證JWT和解析Payload三個步驟。 3.在PHP中使用JWT進行身份驗證時,可以生成和驗證JWT,並在高級用法中包含用戶角色和權限信息。 4.常見錯誤包括簽名驗證失敗、令牌過期和Payload過大,調試技巧包括使用調試工具和日誌記錄。 5.性能優化和最佳實踐包括使用合適的簽名算法、合理設置有效期、

字符串是由字符組成的序列,包括字母、數字和符號。本教程將學習如何使用不同的方法在PHP中計算給定字符串中元音的數量。英語中的元音是a、e、i、o、u,它們可以是大寫或小寫。 什麼是元音? 元音是代表特定語音的字母字符。英語中共有五個元音,包括大寫和小寫: a, e, i, o, u 示例 1 輸入:字符串 = "Tutorialspoint" 輸出:6 解釋 字符串 "Tutorialspoint" 中的元音是 u、o、i、a、o、i。總共有 6 個元

靜態綁定(static::)在PHP中實現晚期靜態綁定(LSB),允許在靜態上下文中引用調用類而非定義類。 1)解析過程在運行時進行,2)在繼承關係中向上查找調用類,3)可能帶來性能開銷。

PHP的魔法方法有哪些? PHP的魔法方法包括:1.\_\_construct,用於初始化對象;2.\_\_destruct,用於清理資源;3.\_\_call,處理不存在的方法調用;4.\_\_get,實現動態屬性訪問;5.\_\_set,實現動態屬性設置。這些方法在特定情況下自動調用,提升代碼的靈活性和效率。
