垃圾收集器(GC)是 PHP 中的內部記憶體管理系統,但有一些微妙之處需要理解。
?為什麼 GC 會存在?
GC 自動化記憶體管理,消除了透過手動任務處理記憶體的麻煩(這會很乏味)。
這使得開發人員可以專注於他們的業務邏輯,而不必過度擔心「記憶體不足」錯誤。
當然,這不是魔法。
?簡而言之 10,000 個對象
釋放不再需要的物件可以防止記憶體洩漏。
GC 使用計數機制來決定要丟棄的元素。如果沒有引用指向特定物件(即 $counter = 0),則該物件有資格進行清理。
它運作得很好,但有些引用可能有問題:
class A { public $b; } class B { public $a; } $a = new A(); $b = new B(); $a->b = $b; $b->a = $a; unset($a); unset($b);
在這種設計不佳的情況下,即使我們取消設定 $a 和 $b,PHP 也不會釋放內存,因為它們相互引用,導致 PHP 認為它們仍在使用中。
幸運的是,還有另一種稱為循環收集器的機制:
gc_collect_cycles();
粗略地說,收集器會遍歷所有引用並應用一種演算法來標記正在使用的對象,從而顯示要收集的對象(未標記的對象)。
但是,PHP 不會觸發自動循環收集,直到達到具有潛在循環引用的 10,000 個物件 的閾值。
再次強調,這不是魔法,因此只有在少數情況下才必須呼叫 gc_collect_cycles()。
?坦斯塔足球俱樂部
糟糕的設計可能會導致物件之間的關係過於複雜,從而導致更多的引用和更頻繁的垃圾回收。
每個引用計數物件都需要額外的儲存空間來儲存其引用計數。
資料來源:維基百科 - 引用計數
與記憶體清理操作相關的開銷會顯著影響全域效能,並最終增加特定場景中的執行時間。
10 年前,Composer 僅透過使用 gc_disable() 函數就獲得了巨大的效能提升。
來源:Composer - 停用 GC
確實,PHP 7 大大改進了 GC,所以現在已經不是 2014 年的樣子了。
此外,PHP 8 版本改進了記憶體分配策略,並添加了更多有關 GC 操作的有用統計信息,以便更好地監控(8.3 中的 gc_status())。
大多數PHP應用程式都是請求驅動的,請求結束時記憶體會自動清除。
再說一遍,這很酷,但並不神奇。非同步請求和長期存在的物件/守護程式會發生什麼?
您可能會在某些時候遇到記憶體洩漏。
? PHP 的 GC 有何不同?
此時,你可能還看不出 PHP 的 GC 與其他語言有何不同。
大多數時候,其他語言不依賴引用計數來收集垃圾,或可能使用不同的實作。
例如,許多使用追蹤演算法,該演算法也標記未使用的對象,但不會增量操作。這是一個圖的遍歷。
此外,某些語言不允許這種直接控制(例如,運行時開/關)。
像往常一樣,有一些優點和不方便,所以你可能會看到一些混合方法。
??與 PHP 的 GC 交互
您可以利用內建的 gc_* 幫助程式。
例如:
- gc_collect_cycles 手動觸發垃圾收集
- gc_status() 給出當前狀態
- gc_disable() 停用它
- gc_enable() 啟用它
這些函數有助於除錯或微調垃圾收集必要時。
?了解記憶體錯誤
您可以閱讀這篇文章以獲得更多見解:

PHP:記憶體錯誤
spO0q ? ・ 2023 年 5 月 24 日
?弱地圖可以拯救嗎?
PHP 7.4 引入了弱引用,PHP 8 引入了弱映射。
弱映射可以被描述為弱引用的集合。
此資料結構是一種多功能鍵值存儲,可幫助 PHP 追蹤項目,而不會造成混亂或消耗過多空間。
您可能會將其視為臨時存儲,當不再需要時將立即清除,因為沒有[強]引用可以阻止垃圾收集:
class A { public $b; } class B { public $a; } $a = new A(); $b = new B(); $a->b = $b; $b->a = $a; unset($a); unset($b);
✅ 優點
- 非常簡單
- 非常適合緩存或記憶(例如,昂貴的計算)
❌ 缺點
- 雖然鍵(物件)不會阻止垃圾回收,但值可以,因此術語「任意值」可能會產生誤導(僅使用簡單資料類型作為值)
- 有價值的用例是有限的
?最佳化程式碼
- 利用減少相互依賴性的設計模式
- 使用依賴注入
- 不要將太大的資料集載入到記憶體中,並使用集合和產生器而不是巨大的陣列
- 監控記憶體使用量
- 使用指標分析您的程式碼
- 謹慎使用 gc_enable()、gc_disable() 和 gc_collect_cycles()
包起來
對於大多數用法,您不必擔心記憶體管理,因為 PHP 已經處理了它。
但是,由於現代堆疊使用長壽命對象,因此您需要監視應用程式是否存在潛在的記憶體洩漏。
如果遇到問題,您可能需要最佳化程式碼和/或直接與 GC 互動。
以上是PHP:用簡單的話解釋垃圾收集器的詳細內容。更多資訊請關注PHP中文網其他相關文章!

使用數據庫存儲會話的主要優勢包括持久性、可擴展性和安全性。 1.持久性:即使服務器重啟,會話數據也能保持不變。 2.可擴展性:適用於分佈式系統,確保會話數據在多服務器間同步。 3.安全性:數據庫提供加密存儲,保護敏感信息。

在PHP中實現自定義會話處理可以通過實現SessionHandlerInterface接口來完成。具體步驟包括:1)創建實現SessionHandlerInterface的類,如CustomSessionHandler;2)重寫接口中的方法(如open,close,read,write,destroy,gc)來定義會話數據的生命週期和存儲方式;3)在PHP腳本中註冊自定義會話處理器並啟動會話。這樣可以將數據存儲在MySQL、Redis等介質中,提升性能、安全性和可擴展性。

SessionID是網絡應用程序中用來跟踪用戶會話狀態的機制。 1.它是一個隨機生成的字符串,用於在用戶與服務器之間的多次交互中保持用戶的身份信息。 2.服務器生成並通過cookie或URL參數發送給客戶端,幫助在用戶的多次請求中識別和關聯這些請求。 3.生成通常使用隨機算法保證唯一性和不可預測性。 4.在實際開發中,可以使用內存數據庫如Redis來存儲session數據,提升性能和安全性。

在無狀態環境如API中管理會話可以通過使用JWT或cookies來實現。 1.JWT適合無狀態和可擴展性,但大數據時體積大。 2.Cookies更傳統且易實現,但需謹慎配置以確保安全性。

要保護應用免受與會話相關的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()啟動會話。配置會話名稱可以避免多應用間的會話數據衝突,並增強安全性,但需注意會話名稱的唯一性、安全性、長度和設置時機。


熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

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

熱門文章

熱工具

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器

Atom編輯器mac版下載
最受歡迎的的開源編輯器

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 英文版
推薦:為Win版本,支援程式碼提示!