一、生成扩展文件目录
首先,我们需要下载php的源码: https://github.com/php/php-src/releases
选择自己对应的版本,下载压缩包即可。
宝塔面板php7.3默认版本为php7.3.3,所以接下来以php7.3.3为例。
真实下载地址如下:
https://codeload.github.com/php/php-src/zip/refs/heads/PHP-7.3.3
下载完后上传到linux服务器,解压。
你也可以使用linux命令wget下载,然后在服务器中解压。
wget https://github.com/php/php-src/archive/php-7.3.3.tar.gz
tar -zvxf php-7.3.3.tar.gz
解压完成后进入php目录 ext/
cd php-src-php-7.3.3/ext
然后在ext文件夹中运行ext_skel.php文件。
php ext_skel.php --ext myext
执行结果如下:
[root@localhost ext]# php ext_skel.php --ext myext
Copying config scripts... done
Copying sources... done
Copying tests... done
Success. The extension is now ready to be compiled into PHP. To do so, use the
following steps:
cd /path/to/php-src
./buildconf
./configure --enable-myext
make
Don't forget to run tests once the compilation is done:
make test TESTS=ext/myext/tests
Thank you for using PHP!
这个时候扩展相关文件就已经全部生成了,后面只需要改代码然后编译就可以了,暂时先不修改代码,先编译一遍看下效果。
二、编译安装
进入扩展文件夹
cd myext
里面有以下几个文件:
tests //文件夹,用于扩展安装之后的测试
config.m4 //配置编译的执行命令
config.w32 //win32编译
php_myext.h //扩展的头文件
myext.c //扩展c文件
我们直接通过phpize生成./configure文件:(多版本情况需要注意phpize版本)
phpize
然后根据正常的安装扩展进行安装:
./configure --with-php-config=/www/server/php/73/bin/php-config
make
make install
在编译完成之后,在php.ini中加入一行配置:
注意引用扩展的真实路径
extension = myext.so
三、测试
进入tests文件夹,运行测试文件:
cd tests
php 001.phpt
php 002.phpt
php 003.phpt
即可看到自定义扩展myext的输出(我的是php多版本,所以用的是php73版本运行)
[root@localhost tests]# php73 001.phpt
--TEST--
Check if myext is loaded
--SKIPIF--
--FILE--
The extension "myext" is available--EXPECT--
The extension "myext" is available
[root@localhost tests]# php73 002.phpt
--TEST--
myext_test1() Basic test
--SKIPIF--
--FILE--
The extension myext is loaded and working!
NULL
--EXPECT--
The extension myext is loaded and working!
NULL
[root@localhost tests]# php73 003.phpt
--TEST--
myext_test2() Basic test
--SKIPIF--
--FILE--
string(11) "Hello World"
string(9) "Hello PHP"
--EXPECT--
string(11) "Hello World"
string(9) "Hello PHP"
这时候,php扩展就已经编译并安装成功了。
也可以编辑PHP文件调用测试函数,感受效果会更直观。
<?php
$test1 = myext_test1();
$test2 = myext_test2();
var_dump($test1);
var_dump($test2);
?>
四、自定义扩展函数
如果要添加新函数,只需要修改myext.c文件即可。
添加一个带参数的函数hello(可以仿照生成自带的函数PHP_FUNCTION(myext_test2)):
PHP_FUNCTION(hello)
{
char *var = "World";//定义一个world字符串变量
size_t var_len = sizeof("World") - 1;//定义长度
zend_string *retval;//定义zend_string类型的变量
ZEND_PARSE_PARAMETERS_START(0, 1)//设置参数数量限制,前面的代表着最少传0个参数,后面的代表了最多传1个
Z_PARAM_OPTIONAL //可选参数 ,不强制传参
Z_PARAM_STRING(var, var_len)//如果有传值,则把值赋值给字符串变量var
ZEND_PARSE_PARAMETERS_END();//设置参数结束
retval = strpprintf(0, "Hello %s", var);//格式化字符串
RETURN_STR(retval);//返回值
}
添加函数进注册模块
static const zend_function_entry myext_functions[] = {
PHP_FE(myext_test1, arginfo_myext_test1)
PHP_FE(myext_test2, arginfo_myext_test2)
PHP_FE(hello, NULL)
PHP_FE_END
};
修改后重新编译安装扩展后即可使用。