7 php 記憶體洩漏 PHP 記憶體管理

2021-10-14 08:21:25 字數 1031 閱讀 7017

php 的記憶體管理來自於 zend 引擎。

php 的記憶體管理與預防記憶體洩漏緊密關聯。

有關執行緒內全域性資料處理的資訊請參見作為執行緒隔離設施的執行緒安全的資源管理器

此外,zend 引擎要面對乙個十分特殊的使用模式:在一段比較短的時間內,許多 zval 結構大小的記憶體塊和其他的小記憶體塊被申請又再被釋放。php 的記憶體管理也很重視 memory_limit(記憶體限制)。

為了滿足以上的需求,zend 引擎提供為了處理請求相關資料提供了一種特殊的記憶體管理器。請求相關資料是指只需要服務於單個請求,最遲會請求結束時釋放的資料。

以下是擴充套件開發的慣例:

防止有記憶體洩漏並盡可能快地釋放所有記憶體是記憶體管理的重要組成部分。

因為安全原因,在請求結束時, zend 引擎會釋放所有由上面提到的 api 所分配的記憶體。

如果 php 使用--enable-debug配置選項進行構建,這將產生乙個警告。

當使用 php 變數時,需要確認變數的記憶體要使用 emalloc 來分配,並注意引用計數。相關細節請檢視變數的使用

記憶體洩漏檢測僅可以發現由 emalloc 分配記憶體塊導致的洩漏。為進行深層分析,建議使用記憶體檢測器,如 valgrind 或 libumem 等。要簡化此分析,可在 php 啟動時通過設定環境變數 use_zend_alloc=0 來禁用 php 的記憶體管理器。

php 中的 unset() 並不真正釋放記憶體。

在 php 中,有很多我們看不到的記憶體分配過程。

隱式的記憶體分配點就有:

為變數名分配記憶體,存入符號表

為變數值分配記憶體

php 的 unset 確實會釋放記憶體。

當我們呼叫 emalloc 申請記憶體的時候,php 會向 os 要一塊大記憶體,然後將其中的部分分配給申請者,其後若再有請求記憶體者,則無需再向 os 索取,可以直接給予,從而避免了頻繁的系統呼叫。

-- 完結 --

PHP記憶體洩漏

如果php物件存在遞迴引用,就會出現記憶體洩漏。這個bug在php裡已經存在很久很久了,先讓我們來重現這個bug,如下 class foo class bar for i 0 i 100 i 執行以上 你會發現,記憶體使用量本應該不變才對,可實際上卻是不斷增加,unset沒有完全生效。現在的開發很多...

php記憶體洩漏 記憶體限制memory limit

記憶體洩漏指的是在程式執行過程中申請了記憶體,但是在使用完成後沒有及時釋放的現象,對於普通執行時間較短的程式來說可能問題不會那麼明顯,但是對於長時間執行的程式,比如web伺服器,後台程序等就比較明顯了,隨著系統執行占用的記憶體會持續上公升,可能會因為占用記憶體過高而崩潰,或被系統殺掉。這裡先簡單說一...

7 PHP 教程 PHP常量

常量值被定義後,在指令碼的其他任何地方都不能被改變.php常量 常量是乙個簡單值的識別符號.該值在指令碼中不能改變.乙個常量由英文本母 下劃線 和數字組成,但數字不能作為首字母出現。常量名不需要加 修飾符 注意 常量在整個指令碼中都可以使用.設定php常量 設定常量,使用define 函式,函式語法...