php自定义扩展extension的两种方式
整理了两种自定义扩展的方式,其他方式请自行扩展
方式一 Zephir
# 安装相关依赖
yum install gcc make re2c autoconf automake -y
安装解释器 https://github.com/zephir-lang/php-zephir-parser
git clone git://github.com/zephir-lang/php-zephir-parser.git cd php-zephir-parser phpize ./configure make && make install
编辑php.ini
vim /usr/local/php/etc/php.ini
[Zephir Parser]
extension=zephir_parser.so
php -m 或 phpinfo 查看安装的模块
安装zephir.phar
# 下载 https://github.com/zephir-lang/zephir/releases/download/0.16.3/zephir.phar # 移动到 /usr/local/bin mv /opt/zephir.phar /usr/local/bin/ chmod 755 zephir.phar ln -s /usr/local/bin/zephir.phar zephir ln -s /usr/local/php/bin/php-config php-config
zephir help
开发扩展
初始化扩展目录
zephir init Hello
cd hello/hello
编写扩展文件
vim world.zep namespace Hello; class World { public function index() { echo "hello world!"; } }
构建包
# 需先开启php函数 exec、shell_exec、system # 编辑php.ini vim /usr/local/php/etc/php.ini # disable_functions 中去除如上三个限制函数 cd ../ # 构建 zephir build
# 构建的的文件在 hello/ext/modules 文件下
# extension_dir 地址可以通过 phpinfo 查看
# 将构建成功之后的.so文件移动到 extension_dir(/usr/local/php/lib/php/extensions/no-debug-non-zts-20190902/) 文件下
mv ext/modules/hello.so /usr/local/php/lib/php/extensions/no-debug-non-zts-20190902/
vim /usr/local/php/etc/php.ini
extension=hello.so
# 重启fpm
systemctl restart php-fpm
测试使用
查看扩展
# 执行测试
php -r 'echo Hello\World::index();'
方式二 编译安装
因环境版本有异,环境php版本为 7.4.32
参考文档:
- php7.4以下参考《如何快速开发一个 PHP 扩展(PHP 扩展开发图文教程)》
- php7.4及以上版本参考《给PHP7.4编写扩展》
# 当前目录 /opt # 下载php安装包,已存在则忽略 wget https://www.php.net/distributions/php-7.4.32.tar.gz tar -xzvf php-7.4.32.tar.gz cd /opt/php-7.4.32/ext ./ext_skel.php --help
# 生成扩展 kk
./ext_skel.php --ext kk
# ext文件夹下会生成kk文件夹 /opt/php-7.4.32/ext/kk
1.编辑config.m4文件
删除 标注行前面的dnl注释(config.m4文件是根据dnl注释的)
php-7.4版本默认是开启的不做更改
2.编辑kk.c
vim kk.c # 文件中已经存在kk_test1、kk_test2函数,我们参考它们写一个kk函数 PHP_FUNCTION(kk) { zend_string *str; str = strpprintf(0, "my name is kk!"); RETURN_STR(str); } # 在 zend_function_entry 添加 PHP_FE(kk, NULL)
3.编译安装
# 编译扩展生成 configure 脚本 phpize # 执行脚本编译参数 ./configure --with-php-config=/usr/local/php/bin/php-config make && make install
# 新增kk.so扩展
vim /usr/local/php/etc/php.ini
extension=kk.so
# 重启fpm
systemctl restart php-fpm
php -m
4.验证测试
php -r "echo kk();"