PHP 的底层是由 c/c++
实现的,所以 PHP 本身就是一层皮,而我们也可以通过开发一些扩展来增强 PHP 的能力。可以通过 php -m
或 phpinfo()
来查看环境中已安装的扩展。这里使用的PHP 版本是 7.4
, 为了方便演示 PHP源码文件在 /Users/linshan/Container/C/php-7.4.24
, 编译安装的目录为 /Users/linshan/Container/C/php-7.4.24/php74
。
生成扩展
进入源码目录下的 ext
目录, 可以看到下面有个 ext_skel.php
文件,该文件是用来生成扩展工程的脚手架命令。
如上命令, 生成名称为 goext
的 PHP 扩展, 在 ext
目录下会生成 goext
文件夹, 该目录下将存放相关扩展的内容。对于 PHP7 是不需要对 php_goext.h
和 goext.c
文件做任何其他变更,可以直接添加自己需要的函数。
打开 goext.c
找一个有利的位置添加以下代码:
PHP_FUNCTION(go_version)
{
php_printf("v1.17");
}
然后找到 static const zend_function_entry goext_functions[]
这行, 将定义的函数添加进来:
到此, PHP 最简单的扩展就已经完成了, go_version
函数的定义在这里的寓意为: 假设用来获取 golang 的版本号。
编译安装
写完了扩展总得检查看看能不能编译吧。接下来我演示下编译安装 goext
扩展。
首先, 进入到 goext
扩展目录。
cd /Users/linshan/Container/C/php-7.4.24/ext/goext
执行 phpize
命令来生成相应的 configure
文件, 已便后续的编译扩展。
/Users/linshan/Container/C/php-7.4.24/php74/bin/phpize
配置安装扩展参数
./configure --with-php-config=/Users/linshan/Container/C/php-7.4.24/php74/bin/php-config
接下来就是编译安装。
make && make install
如无意外, 您将看到类似下面的界面, 表示编译成功了, PHP 会将 so
文件移动到 PHP 扩展的默认文件路径下。
ini 添加扩展
既然扩展编译安装完成, 那我们就看看能不能加入到 PHP 扩展里并使用吧。
查看下 php.ini
所在的位置。
/Users/linshan/Container/C/php-7.4.24/php74/bin/php -i |grep php.ini
打开 php.ini
文件并加入 goext
扩展。
vi /Users/linshan/Container/C/php-7.4.24/php74/lib/php.ini
检查下 goext
扩展是否安装成功。
/Users/linshan/Container/C/php-7.4.24/php74/bin/php -m
// 当然, 您也可以使用命令: /Users/linshan/Container/C/php-7.4.24/php74/bin/php --ri goext
代码调试
简单检查看看能不能调用里面定义的 go_version
函数。
/Users/linshan/Container/C/php-7.4.24/php74/bin/php -r "echo go_version();"
扩展运行成功, 完美输出内容!!!
评论一下?