Toggle navigation
leo's blog
PHP
JavaScript
MySQL
Linux
瞎扯
PHP7扩展开发之"初始化扩展"
PHP
2020-07-16 16:39:15
62
简介:
扩展是PHP的重要部分,开发者可以使用c/c++实现自定义的功能来扩展到PHP中,让PHP扩展能力更强,可以扩展更多的第三方组件
## 1、环境准备 1、本文以centos7操作系统为例 2、PHP版本使用7.0.30(先自行安装完成PHP) 3、php的目录说明 ```shell #php源码目录 /root/lnmp1.5-full/src/php-7.0.30 #php安装地址 /usr/local/php ``` ## 2、扩展初始化 扩展初始化是借助于PHP所提供的工具进行的,由于在Linux环境下所以使用ext_skel完成 1、进入到源码的扩展目录查看ext_skel使用方式 ```shell ./ext_skel --help ```  在选项中最重要的为--extname用于指定扩展名称 2、使用ext_skel生成自定义扩展的骨架 ```shell #注意自己的所在位置。我当前就处于扩展目录下 phper_leo为自定义的扩展名称自己任意指定 ./ext_skel --extname=phper_leo ``` 执行完毕后会在ext目录下生成一个以扩展名称命名的目录 3、自定义的扩展目录  上面的结果中 a) config.m4为autoconf规则的编译器配置文件 b) config.w32为windows环境的配置 c) phper_leo.c为扩展的源码文件 d) phper_leo.h为头文件 e)phper_leo.php 用于测试扩展是否可以用 无需关系 ## 3、实现自定义的扩展 ### 1、修改config.m4 config.m4为autoconf规则的编译器配置文件,以dnl开头的行为注释,此文件在编译时config.4被include到configuer.in文件中最终被autoconf编译为config,所以这个文件只需要修改配置即可。  **只需要去掉10-12行注释即可。** ```php /*原理解释: PHP在acinclude.m4中基于autoconf/automake的宏进行了很多的封装可以直接使用其中PHP_AGE_WITH(arg_name,check,message,help info)定义了一个--with-feature[=arg]这样的编译参数, 常用参数解释 - 第一个参数表示:参数名称、 - 第二个参数表示:执行.configure时展示的信息, - 第三个参数表示:执行--help时的展示信息 */ ``` ### 2、实现扩展源码 1、编辑源码文件注册自定义函数(phper_leo.c)  红色选择的就是增加的自定义函数,其中get_total为函数名称 ```php /*原理解释: PHP提供了一个内部函数注册结构_zend_function_entry,我们自定义的扩展只需要为每个内部的函数注册这样的一个结构。然后将所有函数的结构数组提供给zend_module_entry下的functions即可(可以参考源码Zend/zend_module.h头文件) */ ``` 2、定义函数 直接在源码中增加如下代码 ```c //自己所创建的函数 PHP_FUNCTION(get_total){ //定义两个整型变量 zend_long num1; zend_long num2; //调用zend_parse_parameters分析函数的参数是否正确, if (zend_parse_parameters(ZEND_NUM_ARGS(), "ll", &num1, &num2) == FAILURE) { return; } //返回两个数的和 RETURN_LONG(num1+num2); } ``` ```php /* 原理解释: 1、PHP_FUNCTION为宏会自动进行替换(参考源码main/php.h头文件) get_total为函数名称 2、zend_long为PHP内置的数据类型表示整型数据 3、zend_parse_parameters函数用于将参赛解析到变量上, 函数原型为 ZEND_API int zend_parse_parameters(int num_args,const char *tyoe_spec,...); num_args函数调用时实际传递的参数 可以通过ZEND_NUM_ARGS获取 type_spec为参数的解析规则,是一个字符串,用于标识参数的数据类型, 例如示例中的ll表示两个参数都是整型 最后一个参数表示可变参数,用于配合将参数指定到要解析的变量地址 4、RETURN_LONG为返回整型的宏(在zend_API.h中定义) */ ``` #3、编译扩展使用 1、执行phpize phpize是主要是将复杂的autoconf/automake等系列的命令生成扩展的configure文件  2、执行configure  3、执行make && make install命令安装  4、修改Pphp.ini引入so扩展  5、重启php 创建测试文件 ```php <?php var_dump(get_total(1,2)); ?> ``` 6、执行测试 ```shell php test.php ```
Top