在阅读yaf源码的前提驱动下,了解了php扩展开发的基本步骤。基于php-src提供的ext_skel脚手架生成php扩展的基础代码,我的目的主要是先了解扩展开发的基本步骤,没有改其中的代码,以快速地过一遍php扩展开发重要的流程。这里有个前提是需要准备好指定版本的php-src源码并完成编译安装。
1. 使用ext_skel生成基础代码
进入 php-src/ext/目录,执行:
//我给我的第一个扩展名取名叫firstext$ ./ext_skel --extname=firstext
返回:
Creating directory firstextCreating basic files: config.m4 config.w32 .gitignore firstext.c php_firstext.h CREDITS EXPERIMENTAL tests/001.phpt firstext.php [done].To use your new extension, you will have to execute the following steps:1. $ cd ..2. $ vi ext/firstext/config.m43. $ ./buildconf4. $ ./configure --[with|enable]-firstext5. $ make6. $ ./sapi/cli/php -f ext/firstext/firstext.php7. $ vi ext/firstext/firstext.c8. $ makeRepeat steps 3-6 until you are satisfied with ext/firstext/config.m4 andstep 6 confirms that your module is compiled into PHP. Then, start writingcode and repeat the last two steps as often as necessary.
这时,我们看 ext 目录下多了 firstext 目录,里面的结构:
.├── config.m4├── config.w32├── CREDITS├── EXPERIMENTAL├── firstext.c //扩展通常要有一个 扩展名.c 的一个主文件├── firstext.php├── php_firstext.h //扩展通常要有一个php_扩展名.h的一个头文件└── tests └── 001.phpt
2. 配置IDE
在修改扩展代码之前,我们用IDE 先打开项目,我用的是Clion,需要import project,而不是open一个文件夹,前者会自动生成MakeList,以便IDE自动提示。 自动生成后还要手动增加几条配置,如下
cmake_minimum_required(VERSION 3.10)project(firstext C)set(CMAKE_C_STANDARD 11)include_directories(.)add_executable(firstext firstext.c php_firstext.h)#手动增加的配置#定义php源码路径,这里根据自己的真实路径来更改set(PHP_SOURCE /host/code/github/read-code/php-7.1.18/)#引入php需要的扩展源码,这里也是根据自己需要的来更改include_directories(${PHP_SOURCE}/main)include_directories(${PHP_SOURCE}/Zend)include_directories(${PHP_SOURCE}/sapi)include_directories(${PHP_SOURCE}/pear)include_directories(${PHP_SOURCE})add_custom_target(makefile COMMAND sudo /host/tools/php7.1.18/bin/phpize && ./configure --with-php-config=/host/tools/php7.1.18/bin/php-config && make WORKING_DIRECTORY ${PROJECT_SOURCE_DIR})
3. 修改config.m4
这时候需要修改编译配置文件了。这个config.m4是用于配置扩展的支持选项、及依赖的库等。针对类unix系统提供的是config.m4,是基于autoconf语法编写的,还有一种是config.w32是为windows系统编译用的。
第一次我没改config.m4直接进入配置编译,然后就报modules不存在错了,于是我参考 ,将 PHP_ARG_ENABLE 取消注释,后面就能跑的通了。
4. 配置编译
接下来就是跟安装php扩展一样的步骤了。 在扩展目录下执行:
$ /host/tools/php7.1.18/bin/phpizeConfiguring for:PHP Api Version: 20160303Zend Module Api No: 20160303Zend Extension Api No: 320160303
$ ./configure --with-php-config=/host/tools/php7.1.18/bin/php-config......
$ make && make installnstalling shared extensions: /host/tools/php7.1.18/lib/php/extensions/no-debug-non-zts-20160303/
扩展编译安装完成,在php.ini中加入:
extension=firstext.so
执行命令:
/host/tools/php7.1.18/bin/php -m|grep firstextfirstext
显示有这个插件,就完成了。