程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> PHP內核(一)內存管理,php內核內存管理

PHP內核(一)內存管理,php內核內存管理

編輯:關於PHP編程

PHP內核(一)內存管理,php內核內存管理


一、內存管理基礎

用c語言開發時,開發者要手動進行內存管理。PHP經常作為web服務器的模塊,內存管理與預防內存洩露緊密關聯。另外PHP可能用於線程環境中,所以全局變量可能導致競爭情況。此外Zend引擎面對一個十分特殊的使用模式:在一段比較短的時間內,許多zval結構大小的內存塊和其他的小內存塊被申請又再被釋放,PHP的內存管理也很重視memory_limit(內存限制)

為了滿足以上的需求,Zend引擎提供了為了處理請求相關數據提供了一種特殊的內存管理器。請求相關數據是指只需要服務於單個請求,最遲在請求結束時釋放的數據。擴展開發者主要接觸下表中列出的慣例,雖然一些所提供的便捷功能使用宏實現的,但是本文中會像函數一樣對待。

如上所述,防止有內存洩露並盡可能快的釋放所有內存是內存管理的重要組成部分。因為安全原因,在請求結束時,Zend引擎會釋放所有由上面提到的API所分配的內存。如果PHP使用--enable-debug配置選項進行構建,這將產生一個警告

當使用PHP變量時,需要確認變量的內存要使用emalloc來分配,並注意引用計數。

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

(以上是PHP官網中文內容)

二、數據持久化

數據持久化意味著任何數據預計比當前請求生存時間長,沒有Zend引擎的內存管理器非常關注於請求綁定分配,但是這通常不是實用或者是合適的。持久化內存有時需要為了滿足外部類庫的要求,它也是有用的"黑科技"。

持久化內存通常用在持久化數據庫連接上,雖然實踐起來並不好,但依然是最常使用的特性。

注意:下面所有函數采取額外的持久化參數應該是false,引擎將用常規的分配器(emalloc),內存不應該是 considered persistent(不會翻譯!)。作為持久化的內存,系統調用分配器,正像主要的內存API一樣在大多數情況下它們仍然不返回空指針

警告:需要注意被分配用來持久化的內存不是最優化的或者是被Zend引擎跟蹤的,它不被memory_limit所限制,另外,所有通過the hacker創建的變量一定不能被用來持久化內存。

(翻譯的真爛!)

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved