php扩展之(zend内存管理及zend引擎)

前面一篇写了如何生成扩展模块及书写一个简单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

  • 序言
  • "counter" 扩展 - 一个连续的实例
    • 安装/配置
    • 预定义常量
    • 范例
    • Counter — Counter 类
    • Basic — 简单接口
    • Extended — 扩展接口
  • PHP 5 构建系统
    • PHP 扩展开发构建
    • ext_skel 脚本
    • 与 UNIX 构建系统交互: config.m4
    • 使用 Windows 构建系统:config.w32
  • 扩展的结构
    • 组成扩展的文件
    • Basic constructs
    • The zend_module structure
    • Extension globals
    • Life cycle of an extension
    • Testing an extension
  • 内存管理
    • 内存管理基础
    • 数据持久化
    • 线程安全的资源管理器
  • 变量的使用
    • 介绍
    • 创建变量并设置值
  • 函数的编写
  • 类和对象的使用
  • 资源的使用
  • INI 设置的使用
  • 流的使用
  • PDO 驱动
    • 前提条件
    • 配置与管理
    • Fleshing out your skeleton
    • Building
    • Testing
    • Packaging and distribution
    • pdo_dbh_t definition
    • pdo_stmt_t definition
    • Constants
    • Error handling
  • 扩展相关 FAQ
  • Zend Engine 2 API 参考
  • Zend Engine 2 操作码列表
    • Opcode Descriptions and Examples
  • Zend Engine 1
    • 旧的介绍
    • Streams API for PHP Extension Authors
    • Zend API:深入 PHP 内核
    • TSRM API

参考二:《PHP扩展开发及内核应用》

地址:http://phpbook.sinaapp.com/preface.html

目录中汉字部分代表已经翻译完成的章节,带链接的表示已经发布的,未待链接的表示正在校正即将发布的。

  • 1. PHP的生命周期
    • 1. 让我们从SAPI开始
    • 2. PHP的启动与终止
    • 3. PHP的生命周期
    • 4. 线程安全
    • 5. 小结
  • 2. PHP变量在内核中的实现
    • 1. 变量的类型
    • 2. 变量的值
    • 3. 创建PHP变量
    • 4. 变量的存储方式
    • 5. 变量的检索
    • 6. 类型转换
    • 7. 小结
  • 3. 内存管理
    • 1. 内存管理
    • 2. 引用计数
    • 3. 总结
  • 4. 配置编译环境
    • 1. 编译前的准备
    • 2. PHP编译前的config配置
    • 3. Unix/Linux平台下的编译
    • 4. 在Win32平台上编译PHP
    • 5. 小结
  • 5. 第一个扩展
    • 1. 一个扩展的基本结构
    • 2. 编译我们的扩展
    • 3. 静态编译
    • 4. 编写函数
    • 5. 小结
  • 6. 函数的返回值
    • 1. 一个特殊的参数:return_value
    • 2. 引用与函数的执行结果
    • 3. 小结
  • 7. 函数的参数
    • 1. zend_parse_parameters
    • 2. Arg Info 与类型绑定
    • 3. 小结
  • 8. Array与HashTable
    • 1. 数组(C中的)与链表
    • 2. 操作HashTable的API
    • 3. 在内核中操作PHP语言中数组
    • 3. 小结
  • 9. PHP中的资源类型
    • 1. 复合类型的数据——{资源}
    • 2. Persistent Resources
    • 3. {资源}自有的引用计数
    • 4. 小结
  • 10. PHP中的面向对象(一)
    • 1. zend_class_entry
    • 2. 定义一个类
    • 3. 定义一个接口
    • 4. 类的继承与接口的实现
    • 5. 小结
  • 11. PHP中的面向对象(二)
    • 1. 生成对象的实例与调用方法
    • 2. 读写对象的属性
    • 3. 小结
  • 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


你可能感兴趣的:(php扩展之(zend内存管理及zend引擎))