前面一篇写了如何生成扩展模块及书写一个简单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. 启动与终止的那点事
-
- 1. 循环
- 2. MINFO与phpinfo
- 3. 常量
- 4. 编写扩展时的常量
- 5. PHP语言中的超级变量
- 6. 小结
- 13. INI Settings
-
- 1. Declaring and Accessing INI Settings
- 2. Summary
- 14. Accessing Streams
-
- 1. Streams Overview
- 2. Opening Streams
- 3. Accessing Streams
- 4. Static Stream Operations
- 5. Summary
- 15. Implementing Streams
-
- 1. PHP Streams Below the Surface
- 2. Wrapper Operations
- 3. Implementing a Wrapper
- 4. Manipulation
- 5. Inspection
- 6. Summary
- 16. Diverting the Stream
-
- 1. Contexts
- 2. Filters
- 3. Summary
- 17. Configuration and Linking
-
- 1. Autoconf
- 2. Looking for Libraries
- 3. Enforcing Module Dependencies
- 4. Speaking the Windows Dialect
- 5. Summary
- 18. 扩展生成器
-
- 1. ext_skel生成器
- 2. PECL_Gen生成器
- 3. 小结
- 19. Setting Up a Host Environment
-
- 1. The Embed SAPI
- 2. Building and Compiling a Host Application
- 3. Re-creating CLI by Wrapping Embed
- 4. Reusing Old Tricks
- 5. Summary
- 20. Advanced Embedding
-
- 1. Calling Back into PHP
- 2. Dealing with Errors
- 3. Initializing PHP
- 4. Overriding INI_SYSTEM and INI_PERDIR Options
- 5. Capturing Output
- 6. Extending and Embedding at Once
- 7. Summary