PHP扩展开发之c与c++两种模式


使用c或者c++开发php扩展的目的在于,利用c和c++的高效性提高性能,毕竟php只是一个脚本语言。php的msyqli等扩展就是一个例子,可以从其中了解php扩展的大概框架。

准备工作

  1. 下载相应的php源码

  2. 编译需要的库文件

开发扩展

1.创建扩展项目

进入php源码的ext目录,生成一个名为test的扩展项目

1
./ext_skel --extname=test

2.编辑配置文件

进入test目录,里面存在一个config.m4和test.c。config.m4文件是扩展项目的编译配置文件,类似于Qt的pro文件。打开config.m4文件。打开其中三行的注释,dnl就是改行的注释删除即可:

这三句话的意思就是在编译安装php的时候可以开启test扩展的支持。然后配置扩展依赖的的动态库或者静态库。示例如下:

PHP_ADD_INCLUDE添加编译的头文件搜索路径。PHP_ADD_LIBRARY按照我的理解就是添加系统库路径下的库文件,比如/usr/lib路径。PHP_ADD_LIBRARY_PATH就是添加指定路径的第三方库。PHP_REQUIRE_CXX()指定c++编译,没有的话就是按照c编译。PHP_NEW_EXTENSION就是配置文件的关键,创建指定的扩展。第一个参数是扩展名,第二个参数是扩展用到的实现源码(不包含.h,可以包含多个,中间用空格隔开,例如 test1.cpp test2.cpp)。此处默认生成应该是wy_analyze.c,由于我的项目需要使用c++,所以我改成了.cpp,对应的文件的名称也应该改为.cpp。

3.编写wy_analyze.cpp

首先使用extern “C” {}包含该文件自动添加的.h头文件,如下:

添加函数定义,参考自动生成的例子

confirm_wy_analyze_compiled是php自动生成的测试函数(后续完成之后可以去掉),我们可以参照这个例子编写我们自己的函数,后面两个就是我定义的函数,类似于头文件的定义。

完成函数实现

我们以测试参考例子来简单说明。arg是函数的传入参数,arg_len是参数长度,zend_parse_parameters是php校验函数参数的一个方法,第一个参数 ZEND_NUM_ARGS()表示参数的个数,第三个参数”s”表示只有一个字符串参数,如果是函数是两个字符串变量,那么这个参数声明和校验如下:

其他类型的参数的格式请参考其他资料,这里就不详细说明了。

4.编译安装扩展

1
2
3
4
5
cd php/ext/your_extdir
phpize
./configure --with-php-config=php-config
make
sudo make install

编译链接生成完的.so会自动拷贝到php的扩展目录里面。如果修改了源码需要重新编译,可以清除。

1
2
phpize --clean #清除所有配置和编译产生的文件
make clean #清除编译产生的文件,不需要重新configure

5.修改php.ini添加扩展信息

如果找不到php.ini的路径可以php-config 查看。在php.ini里面添加如下信息

同理添加php的自带扩展,只需要取消该扩展的注释即可。然后重启php就会生效。

1
2
sudo service nginx restart
sudo service php-fpm restart

PHP扩展开发之c与c++两种模式
http://yoursite.com/2019/03/19/PHP扩展开发之c与c-两种模式/
作者
还在输入
发布于
2019年3月19日
许可协议