IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

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

搜索研发部官方博客 2011-06-21 13:37:32 累计浏览 4,105 次
本机暂存

类和对象(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. 等了十年的 Go 链式管道,终于来了:seq 让你像写 Scala 一样写 Go (2026-06-25 18:38:18)
  2. Go 实验特性详解 (2026-06-21 10:05:27)
  3. amd64 微架构级别对 Go 程序性能提升多少? (2026-06-21 09:38:49)

查看更多 后端 文章 →

建议继续学习

  1. 使用gettext来支持PHP的多语言 (累计阅读 39,270)
  2. WordPress插件开发 -- 在插件使用数据库存储数据 (累计阅读 29,164)
  3. Paypal接口详细代码(PHP版,非API接口) (累计阅读 19,408)
  4. 我的PHP,Python和Ruby之路 (累计阅读 13,150)
  5. include(“./file.php”)和include(“file.php”)区别 (累计阅读 12,790)
  6. 15个最好的免费开源电子商务平台 (累计阅读 12,541)
  7. Redis消息队列的若干实现方式 (累计阅读 12,088)
  8. 到底什么是MVC? (累计阅读 11,869)
  9. 整理了一份招PHP高级工程师的面试题 (累计阅读 11,709)
  10. gdb的基本工作原理是什么? (累计阅读 11,684)