一、下载 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的PHP扩展的基本骨架

在当前目录生成了一个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!