PHP核心一記憶體管理

來源:互聯網
上載者:User
一、記憶體管理基礎

用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一樣在大多數情況下它們仍然不返回null 指標

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

(翻譯的真爛!)

以上就介紹了PHP核心一記憶體管理,包括了方面的內容,希望對PHP教程有興趣的朋友有所協助。

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.