前面一篇寫了如何生成擴展模塊及書寫一個簡單d擴展模塊,當設計到用c書寫複雜的擴展函數那麼就離不開zend 內存篇了;本文整理內存管理相關內容;
內存管理
在C語言裏,分配內存有一組alloc函數,比如malloc、calloc、realloc。php爲了更方便,更安全地管理內存,自己提供了一組內存分配的函數:emalloc、ecalloc、erealloc,此外還有estrdup用於拷貝內存,efree用於釋放由前面那些函數分配的內存。他們的用法和標準C函數的一樣。這組e開頭的函數分配的內存空間只存在於一次請求。在請求結束後,php會自動釋放掉。這就減少了由於沒有釋放掉內存而造成的內存泄露的可能。
如果需要分配的內存在整個進程運行時都保持,而不是在請求處理結束後自動釋放,則還有一組pe開頭的函數,如pemalloc、pecalloc等。這組函數比標準C函數的多一個參數,即分配的內存是否持久,當這個參數爲1時,即表示分配的是持久的內存,不會隨着請求結束而自動釋放。如:pemalloc(sizeof(long) * 100, 1);。
此外,爲了方便使用,還提供了safe_emalloc和safe_pemalloc這兩個函數。 safe_emalloc的原型如下:void *safe_emalloc(size_t size, size_t count, size_t addtl);。參數分別表示單元的大小,單元的個數,以及偏移。實際分配的空間大小就是size * count + addtl。safe_pemalloc與之類似。這兩個函數還有一個作用就是避免手工做上面的計算時,可能造成整數溢出,而導致分配的內存大小小於預期或者是個負數。
參考一:
PHP 核心:Zend 引擎的黑客指南
地址:http://www.php.net/manual/zh/internals2.php
參考二:《PHP擴展開發及內核應用》
地址:http://phpbook.sinaapp.com/preface.html
目錄中漢字部分代表已經翻譯完成的章節,帶鏈接的表示已經發布的,未待鏈接的表示正在校正即將發佈的。
- 1. PHP的生命週期
- 2. PHP變量在內核中的實現
- 3. 內存管理
- 4. 配置編譯環境
- 5. 第一個擴展
- 6. 函數的返回值
- 7. 函數的參數
- 8. Array與HashTable
- 9. PHP中的資源類型
- 10. PHP中的面向對象(一)
- 11. PHP中的面向對象(二)
- 12. 啓動與終止的那點事
- 13. INI Settings
- 14. Accessing Streams
- 15. Implementing Streams
- 16. Diverting the Stream
- 17. Configuration and Linking
- 18. 擴展生成器
- 19. Setting Up a Host Environment
- 20. Advanced Embedding