本文主要和大家分享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中文網其他相關文章!

要保護應用免受與會話相關的XSS攻擊,需採取以下措施:1.設置HttpOnly和Secure標誌保護會話cookie。 2.對所有用戶輸入進行輸出編碼。 3.實施內容安全策略(CSP)限制腳本來源。通過這些策略,可以有效防護會話相關的XSS攻擊,確保用戶數據安全。

优化PHP会话性能的方法包括:1.延迟会话启动,2.使用数据库存储会话,3.压缩会话数据,4.管理会话生命周期,5.实现会话共享。这些策略能显著提升应用在高并发环境下的效率。

theSession.gc_maxlifetimesettinginphpdeterminesthelifespanofsessiondata,setInSeconds.1)它'sconfiguredinphp.iniorviaini_set().2)abalanceisesneededeededeedeedeededto toavoidperformance andunununununexpectedLogOgouts.3)

在PHP中,可以使用session_name()函數配置會話名稱。具體步驟如下:1.使用session_name()函數設置會話名稱,例如session_name("my_session")。 2.在設置會話名稱後,調用session_start()啟動會話。配置會話名稱可以避免多應用間的會話數據衝突,並增強安全性,但需注意會話名稱的唯一性、安全性、長度和設置時機。

會話ID應在登錄時、敏感操作前和每30分鐘定期重新生成。 1.登錄時重新生成會話ID可防會話固定攻擊。 2.敏感操作前重新生成提高安全性。 3.定期重新生成降低長期利用風險,但需權衡用戶體驗。

在PHP中設置會話cookie參數可以通過session_set_cookie_params()函數實現。 1)使用該函數設置參數,如過期時間、路徑、域名、安全標誌等;2)調用session_start()使參數生效;3)根據需求動態調整參數,如用戶登錄狀態;4)注意設置secure和httponly標誌以提升安全性。

在PHP中使用會話的主要目的是維護用戶在不同頁面之間的狀態。 1)會話通過session_start()函數啟動,創建唯一會話ID並存儲在用戶cookie中。 2)會話數據保存在服務器上,允許在不同請求間傳遞數據,如登錄狀態和購物車內容。

如何在子域名間共享會話?通過設置通用域名的會話cookie實現。 1.在服務器端設置會話cookie的域為.example.com。 2.選擇合適的會話存儲方式,如內存、數據庫或分佈式緩存。 3.通過cookie傳遞會話ID,服務器根據ID檢索和更新會話數據。


熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

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

DVWA
Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

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

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),