PHP中的GC機制詳解
本文主要介紹了解讀PHP中的垃圾回收機制,是否擁有GC功能是一門程式語言開發的重要重點。希望對大家有幫助。
PHP的基本GC概念
PHP語言同其他語言一樣,具有垃圾回收機制。那麼今天我們要為大家講解的內容就是關於PHP垃圾回收機制的相關問題。希望對大家有幫助。 PHP strtotime應用經驗之談PHP memory_get_usage()管理記憶體PHP unset全域變數運用問題詳談PHP unset()函數銷毀變數教你快速實作PHP全站權限驗證一、PHP 垃圾回收機制(Garbage Collector 簡稱GC) 在PHP中,沒有任何變數指向這個物件時,這個物件就變成垃圾。 PHP會將其在記憶體中銷毀;這是PHP的GC垃圾處理機制,防止記憶體溢出。當一個PHP執行緒結束時,目前佔用的所有記憶體空間都會被銷毀,目前程式中所有物件同時被銷毀。 GC程序一般都跟著每起一個SESSION而開始運行的.gc目的是為了在session文件過期以後自動銷毀刪除這些文件.二、__destruct /unset __destruct() 析構函數,是在垃圾對像被回收時執行。
unset 銷毀的是指向物件的變量,而不是這個物件。三、 Session 與PHP垃圾回收機制由於PHP的工作機制,它並沒有一個daemon線程來定期的掃描Session信息並判斷其是否失效,當一個有效的請求發生時,PHP 會根據全局變量session.gc_probability和session .gc_pisor的值,來決定是否啟用一個GC, 在預設情況下,session.gc_probability=1, session.gc_pisor =100也就是說有1%的可能性啟動GC(也就是說100個請求中只有一個gc會伴隨100個中的某個請求而啟動).PHP垃圾回收機制的工作就是掃描所有的Session信息,用當前時間減去session最後修改的時間,同session.gc_maxlifetime參數進行比較,如果生存時間超過gc_maxlifetime (預設24分鐘),就將該session刪除。
但是,如果你Web伺服器有多個站點,多個站點時,GC處理session可能會出現意想不到的結果,原因就是:GC在工作時,並不會區分不同站點的session.那麼這個時候怎麼解決呢?
1. 修改session.save_path,或使用session_save_path()讓每個站點的session保存到一個專用目錄,
2. 提供GC的啟動率,自然,PHP垃圾回收機制的啟動率提高,系統的性能也會隨之減低,不建議。
3. 在程式碼中判斷目前session的生存時間,利用session_destroy()刪除。
引用計數基本知識
每個php變數存在一個叫做"zval"的變數容器中.一個zval變數容器,除了包含變數的型別和值,還包括兩個位元組的額外資訊。第一個是"is_ref",是個bool值,用來標識這個變數是否是屬於引用集合(reference set).透過這個位元組,php引擎才能把普通變數和引用變數區分開.由於php允許使用者透過使用&來使用自訂引用,zval變數容器中還有一個內部引用計數機制,來優化記憶體使用.第二個額外位元組是"refcount",用來表示指向這個zval變數容器的變數(也稱符號即symbol)個數.
當一個變數被賦常量值時,就會產生一個zval變數容器,如下例所示:
<?php $a = "new string"; ?>
在上例中,新的變數是a,是在目前作用域中產生的.並且產生了類型為string和值為"new string"的變數容器.在額外的兩個位元組資訊中,"is_ref"被預設為false,因為沒有任何自訂的引用生成."refcount"被設定為1,因為這裡只有一個變數使用這個變數容器.呼叫xdebug查看變數內容:
<?php $a = "new string"; xdebug_debug_zval('a'); ?>
以上程式碼會輸出:
a: (refcount=1, is_ref=0)='new string'
對變數a增加一個引用計數
<?php $a = "new string"; $b = $a; xdebug_debug_zval('a'); ?>
以上程式碼會輸出:
a: (refcount=2, is_ref=0)='new string'
#這時,引用次數是2,因為同一變數容器被變數a和變數b關聯.當沒必要時,php不會去複製已產生的變數容器.變數容器在"refcount"變成0時就被銷毀.當任何關聯到某個變數容易的變數離開它的作用域(例如:函數執行結束),或是對變數呼叫了unset()函數,"refcount"就會減1,下面例子就能說明:
<?php $a = "new string"; $b = $c = $a; xdebug_debug_zval('a'); unset($b, $c); xdebug_debug_zval('a'); ?>
以上程式碼會輸出:
a: (refcount=3, is_ref=0)='new string' a: (refcount=1, is_ref=0)='new string'
如果我們現在執行unset($a),$包含的這個類型和值的容器就會從記憶體刪除
複合型別(compound types)
當考慮像array和object這樣的複合型別(compound types)
當考慮像array和object這樣的複合型別(compound types)
<?php $a = array('meaning' => 'life', 'number' => 42); xdebug_debug_zval('a'); ?>
以上代码输出:
a: (refcount=1, is_ref=0)=array ('meaning' => (refcount=1, is_ref=0)='life', 'number' => (refcount=1, is_ref=0)=42)
这三个zval变量容器是:a,meaning,number.增加和减少refcount的规则和上面提到的一样
特例,添加数组本身作为数组元素时:
<?php $a = array('one'); $a[] = &$a; xdebug_debug_zval('a'); ?>
以上代码输出的结果:
a: (refcount=2, is_ref=1)=array (0 => (refcount=1, is_ref=0)='one', 1 => (refcount=2, is_ref=1)=...)
可以看到数组a和数组本身元素a[1]指向的变量容器refcount为2
当对数组$a调用unset函数时,$a的refcount变为1,发生了内存泄漏
清理变量容器的问题
尽管不再有某个作用域中的任何符号指向这个结构(就是变量容器),由于数组元素"1"仍然指向数组本身,所以这个容器不能被消除.因为没有另外的符号指向它,用户没有办法清除这个结构,结果就会导致内存泄漏.庆幸的是,php将在请求结束时清除这个数据结构,但是php清除前,将耗费不少内存空间
回收周期
5.3.0PHP使用了新的同步周期回收算法,来处理上面所说的内存泄漏问题
首先,我们先要建立一些基本规则:
如果一个引用计数增加,它将继续被使用,当然就不再垃圾中.如果引用技术减少到零,所在的变量容器将被清除(free).就是说,仅仅在引用计数减少到非零值时,才会产生垃圾周期(grabage cycle).其次,在一个垃圾周期中,通过检查引用计数是否减1,并且检查哪些变量容器的引用次数是零,来发现哪部分是垃圾
为避免不得不检查所有引用计数可能减少的垃圾周期,这个算法把所有可能根(possible roots 都是zval变量容器),放在根缓冲区(root buffer)中(用紫色标记),这样可以同时确保每个可能的垃圾根(possible garbage root)在缓冲区只出现一次.仅仅在根缓冲区满了时,才对缓冲区内部所有不同的变量容器执行垃圾回收操作。
相关推荐:
以上是PHP中的GC機制詳解的詳細內容。更多資訊請關注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 8.4 帶來了多項新功能、安全性改進和效能改進,同時棄用和刪除了大量功能。 本指南介紹如何在 Ubuntu、Debian 或其衍生版本上安裝 PHP 8.4 或升級到 PHP 8.4

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

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

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

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

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

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

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