PHP内核介绍及扩展开发指南―类和对象
类和对象(TODO)
附录A. Extension的编译
Extension的编译是比较简单的,下面是个示例Makefile:
# 扩展搜索目录,模块被放到这里才能被找到和加载 # 可以从php.ini中的extension_dir命令获取该值 PHP_EXT_HOME=/home/wiki/php5/lib/php/extensions/ # PHP源代码路径 PHP_SRC=/home/wiki/wikienv/install/php-5.2.3 INCLUDE=-I$(PHP_SRC) -I$(PHP_SRC)/main -I$(PHP_SRC)/TSRM -I$(PHP_SRC)/Zend CC=gcc all: first_module.so first_module.so: first_module.o $(CC) -shared -rdynamic -o first_module.so first_module.o # 注意不要忘了“-DCOMPILE_DL_FIRST_MODULE=1”,否则不会导出get_module() first_module.o: first_module.c $(CC) -fpic -DCOMPILE_DL_FIRST_MODULE=1 $(INCLUDE) -c first_module.c clean: rm -fr *.so *.o install: first_module.so cp -fp first_module.so $(PHP_EXT_HOME)
这将创建一个可动态加载的Extension模块,如果想将Extension静态编译进PHP,就需要使用PHP本身的编译系统,这里不作介绍。
另外,Zend提供了一个小脚本来简化创建和编译Extension的过程,可以在《PHP手册》的相关章节找到其使用方法。
目前,Zend正在开发一个更加完善和标准的Extension生成工具,可以在这里找到它:http://pecl.php.net/package/PECL_Gen
附录B. Extension的加载过程
Extension有两种加载方式,通过php.ini在启动时加载或是通过dl()函数在运行时加载,前者需在php.ini中添加一行命令:extension=myext.so。这两种方式最后都将调用一个名为php_ld()的内部函数。
php_ld()首先调用系统例程加载动态库,之后解析并执行get_module()函数来获得模块的zend_module_entry结构(参见2.1.3)。
然后,调用函数zend_register_module_ex()来注册模块,这个函数先将模块的zend_module_entry加入到一个名为module_registry的HashTable中,然后调用zend_register_functions将模块导出的函数加入CG(function_table)(参见2.5)这个HashTable中,这样我们就可以调用模块导出的函数了。最后,php_ld()将调用模块的启动函数(参见2.4)来初始化模块。
如果模块是dl()动态加载的,Zend还将接着调用模块的激活函数,因为当前显然有页面在运行。
最后要说明的是,通过dl()加载的模块称为“临时模块”,在页面执行完毕时将被卸载,同时,其创建的常量和资源也将被销毁。
建议继续学习:
- linux内核研究笔记(一)内存管理 – page介绍 (阅读:8763)
- 面向对象的Shell脚本 (阅读:5210)
- PHP内核介绍及扩展开发指南―Extensions 的编写 (阅读:4734)
- chrome扩展应用开发教程之开发chrome应用基础 (阅读:4805)
- 用星际争霸讲解面向对象的概念 (阅读:4206)
- 使用PHP创建一个面向对象的博客 (阅读:4132)
- 我的内核配置文件 (阅读:3784)
- Linux内核协议栈对于timewait状态的处理 (阅读:3812)
- PHP内核介绍及扩展开发指南―高级主题 (阅读:3682)
- 深入理解PHP原理之扩展载入过程 (阅读:3499)
扫一扫订阅我的微信号:IT技术博客大学习
- 作者:editor 来源: 搜索研发部官方博客
- 标签: 内核 对象 扩展 类
- 发布时间:2011-06-21 13:37:32
- [71] IOS安全–浅谈关于IOS加固的几种方法
- [70] Twitter/微博客的学习摘要
- [65] 如何拿下简短的域名
- [64] android 开发入门
- [63] Go Reflect 性能
- [62] find命令的一点注意事项
- [60] 流程管理与用户研究
- [59] 读书笔记-壹百度:百度十年千倍的29条法则
- [59] 图书馆的世界纪录
- [58] Oracle MTS模式下 进程地址与会话信