IT技术博客大学习 共学习 共进步

PHP内核介绍及扩展开发指南―类和对象

搜索研发部官方博客 2011-06-21 13:37:32 浏览 4,004 次

类和对象(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()加载的模块称为“临时模块”,在页面执行完毕时将被卸载,同时,其创建的常量和资源也将被销毁。

建议继续学习

  1. linux内核研究笔记(一)内存管理 – page介绍 (阅读 10,322)
  2. 面向对象的Shell脚本 (阅读 5,984)
  3. chrome扩展应用开发教程之开发chrome应用基础 (阅读 5,602)
  4. PHP内核介绍及扩展开发指南―Extensions 的编写 (阅读 5,422)
  5. 使用PHP创建一个面向对象的博客 (阅读 5,323)
  6. 用星际争霸讲解面向对象的概念 (阅读 5,101)
  7. Linux内核协议栈对于timewait状态的处理 (阅读 4,762)
  8. PHP内核介绍及扩展开发指南―基础知识 (阅读 4,701)
  9. 我的内核配置文件 (阅读 4,681)
  10. PHP内核介绍及扩展开发指南―高级主题 (阅读 4,581)