一、下载 PHP 官方源码
https://www.php.net/releases/index.php
我下载的是 PHP 7.2.25 版本:
wget https://php.net/distributions/php-7.2.25.tar.gz
// 解压
tar -zxvf php-7.2.25.tar.gz
cd php-7.2.25/ext/
二、生成扩展的基本骨架
在 ext 目录执行命令:
./ext_skel --extname=foobar
在当前目录生成了一个foobar
的文件夹,我们扩展的所有代码都将放在此目录下
三、添加扩展功能
1. 编辑 config.m4 文件,去掉 16、18 行的注释,如下图所示:
2. 编辑 php_foobar.h 文件:声明一个函数
在文件底部添加两行代码
PHP_FUNCTION(confirm_foobar_compiled);
PHP_FUNCTION(halo);
声明了一个名为halo
的 PHP 空间的函数,在 PHP 的代码里就可以像普通函数一样调用它。当然,目前到这一步还不行,因为这里只是声明,还没有定义它的行为。我们将在foobar.c
文件中编写它的函数体。
3. 编辑foobar.c文件:定义函数体
foobar.c
是扩展主要实现的地方,找到下面几行:
在 149 行下面添加PHP_FE(halo, NULL)
。注意不要添加任何分号。如下:
这一步是向 PHP 空间注册一个函数,名字就是刚才在php_foobar.h
文件声明的halo
接下来是真正编写halo
函数实现的时候。
在文件末尾添加以下代码:
PHP_FUNCTION(halo){
php_printf("hello world!");
}
从代码看出:halo
函数只是打印一串字符串hello world
,不做其他任何事情。
OK!编码完毕,下面就是把扩展编译进 PHP,供 PHP 代码调用!
四、编译安装扩展
扩展编译分动态编译和静态编译两种方法!下面演示的是动态编译。
在当前目录下执行 phpize
执行完phpize
命令,你会发现扩展目录下多出了好多文件
./configure --enable-foobar
make
顺利make
完之后,会在扩展的目录下的modules
子目录多了一个foobar.so
的文件, 它就是我们刚才编写的扩展的最终产物。
复制foobar.so
的完整路径,vim 打开 PHP 的配置文件php.ini
,在文件的末尾加入以下内容
extension=/home/ryan/Desktop/php-7.2.25/ext/foobar/modules/foobar.so
#这是在我的系统foobar.so路径
# 重启 nginx、php-fpm
systemctl restart nginx php-fpm
五、验证扩展功能
打开 phpinfo 页面可以看到刚刚编写的扩展 foobar
在 php 文件中输入 halo(),执行可以看到输出 hello world!