php回收週期的介紹
這篇文章帶給大家的內容是關於php回收週期的介紹,有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。
以下程序僅對陣列和物件類型起作用。
傳統上,像是以前的 php 所用的引用計數記憶體機制,無法處理循環的引用記憶體洩漏。然而 5.3.0 PHP 使用文章» 引用計數系統中的同步週期回收(Concurrent Cycle Collection in Reference Counted Systems)中的同步演算法,來處理這個記憶體洩漏問題。
對演算法的完全說明有點超出這部分內容的範圍,將只介紹其中基礎部分。首先,我們先要建立一些基本規則,如果一個引用計數增加,它將繼續被使用,當然就不再在垃圾中。如果引用計數減少到零,所在變數容器將被清除(free)。是說,僅僅在引用計數減少到非零值時,才會產生垃圾週期(garbage cycle)。其次,在一個垃圾週期中,透過檢查引用計數是否減1,並且檢查哪些變數容器的引用次數是零,來發現哪一部分是垃圾。
為避免必須檢查所有參考計數可能減少的垃圾週期,這個演算法把所有可能根(possible roots 都是zval變數容器),放在根緩衝區(root buffer)中(用紫色來標記,稱為疑似垃圾),這樣可以同時確保每個可能的垃圾根(possible garbage root)在緩衝區中只出現一次。僅在根緩衝區滿了時,才對緩衝區內部所有不同的變數容器執行垃圾回收操作。看上圖的步驟 A。
在步驟 B 中,模擬刪除每個紫色變數。模擬刪除時可能將不是紫色的普通變數引用數減」1″,如果某個普通變數引用計數變成0了,就對這個普通變數再做一次模擬刪除。每個變數只能被模擬刪除一次,模擬刪除後標記為灰(原文說確保不會對同一個變數容器減兩次”1″,不對的吧)。
在步驟 C 中,模擬恢復每個紫色變數。恢復是有條件的,當變數的引用計數大於0時才對其做模擬恢復。同樣每個變數只能恢復一次,恢復後標示為黑,基本上就是步驟 B 的逆運算。這樣剩下的一堆沒能恢復的就是該刪除的藍色節點了,在步驟 D 中遍歷出來真的刪除掉。
演算法中都是模擬刪除、模擬恢復、真的刪除,都使用簡單的遍歷即可(最典型的深搜遍歷)。複雜度為執行模擬操作的節點數呈正相關,不只是紫色的那些疑似垃圾變數。
現在,你已經對這個演算法有了基本了解,我們回頭來看這個如何與PHP整合。預設的,PHP的垃圾回收機制是打開的,然後有個 php.ini 設定允許你修改它:zend.enable_gc 。
當垃圾回收機制開啟時,每當根快取區存滿時,就會執行上面描述的循環查找演算法。根快取區有固定的大小,可存10,000個可能根,當然你可以透過修改PHP原始碼檔案Zend/zend_gc.c中的常數GC_ROOT_BUFFER_MAX_ENTRIES,然後重新編譯PHP,來修改這個10,000值。當垃圾回收機制關閉時,循環查找演算法永不執行,然而,可能根將一直存在根緩衝區中,不管在配置中垃圾回收機制是否啟動。
當垃圾回收機制關閉時,如果根緩衝區存滿了可能根,更多的可能根顯然不會被記錄。那些沒被記錄的可能根,將不會被這個演算法分析處理。如果他們是循環引用週期的一部分,將永遠不能被清除進而導致記憶體洩漏。
即使在垃圾回收機制不可用時,可能根也被記錄的原因是,相對於每次找到可能根後檢查垃圾回收機制是否打開而言,記錄可能根的操作更快。不過垃圾回收和分析機製本身要耗不少時間。
除了修改配置zend.enable_gc ,也能透過分別呼叫gc_enable() 和 gc_disable()函數來開啟和關閉垃圾回收機制。呼叫這些函數,與修改配置項來開啟或關閉垃圾回收機制的效果是一樣的。即使在可能根緩衝區還沒滿時,也能強制執行週期回收。你能呼叫gc_collect_cycles()函數達到這個目的。這個函數將會傳回使用這個演算法回收的周期數。
允許打開和關閉垃圾回收機制並且允許自主的初始化的原因,是由於你的應用程式的某一部分可能是高時效性的。在這種情況下,你可能不想使用垃圾回收機制。當然,對你的應用程式的某部分關閉垃圾回收機制,是在冒著可能記憶體洩漏的風險,因為一些可能根也許存不進有限的根緩衝區。因此,就在你呼叫gc_disable()函數釋放記憶體之前,先呼叫gc_collect_cycles()函數可能比較明智。因為這將清除已存放在根緩衝區中的所有可能根,然後在垃圾回收機制被關閉時,可留下空緩衝區以有更多空間存儲可能根。
以上是php回收週期的介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

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

熱門文章

熱工具

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

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

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

Dreamweaver CS6
視覺化網頁開發工具

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

PHP和Python各有優勢,選擇依據項目需求。 1.PHP適合web開發,尤其快速開發和維護網站。 2.Python適用於數據科學、機器學習和人工智能,語法簡潔,適合初學者。

PHP在電子商務、內容管理系統和API開發中廣泛應用。 1)電子商務:用於購物車功能和支付處理。 2)內容管理系統:用於動態內容生成和用戶管理。 3)API開發:用於RESTfulAPI開發和API安全性。通過性能優化和最佳實踐,PHP應用的效率和可維護性得以提升。

PHP是一種廣泛應用於服務器端的腳本語言,特別適合web開發。 1.PHP可以嵌入HTML,處理HTTP請求和響應,支持多種數據庫。 2.PHP用於生成動態網頁內容,處理表單數據,訪問數據庫等,具有強大的社區支持和開源資源。 3.PHP是解釋型語言,執行過程包括詞法分析、語法分析、編譯和執行。 4.PHP可以與MySQL結合用於用戶註冊系統等高級應用。 5.調試PHP時,可使用error_reporting()和var_dump()等函數。 6.優化PHP代碼可通過緩存機制、優化數據庫查詢和使用內置函數。 7

PHP仍然具有活力,其在現代編程領域中依然佔據重要地位。 1)PHP的簡單易學和強大社區支持使其在Web開發中廣泛應用;2)其靈活性和穩定性使其在處理Web表單、數據庫操作和文件處理等方面表現出色;3)PHP不斷進化和優化,適用於初學者和經驗豐富的開發者。

PHP和Python各有優勢,選擇應基於項目需求。 1.PHP適合web開發,語法簡單,執行效率高。 2.Python適用於數據科學和機器學習,語法簡潔,庫豐富。

PHP和Python各有優劣,選擇取決於項目需求和個人偏好。 1.PHP適合快速開發和維護大型Web應用。 2.Python在數據科學和機器學習領域佔據主導地位。

PHP適合web開發,特別是在快速開發和處理動態內容方面表現出色,但不擅長數據科學和企業級應用。與Python相比,PHP在web開發中更具優勢,但在數據科學領域不如Python;與Java相比,PHP在企業級應用中表現較差,但在web開發中更靈活;與JavaScript相比,PHP在後端開發中更簡潔,但在前端開發中不如JavaScript。

PHP主要是過程式編程,但也支持面向對象編程(OOP);Python支持多種範式,包括OOP、函數式和過程式編程。 PHP適合web開發,Python適用於多種應用,如數據分析和機器學習。
