php7扩展开发教程,Linux下PHP7扩展开发入门教程1:扩展开发流程
本文将会基于PHP7开发一个最简单的扩展,随便取个名learn_ext,编译生成一个learn_ext.so文件,最终调用可以在php中调用learn_ext扩展中的函数来输出一个hello world,并且可以在phpinfo()中看到learn_ext展信息。
开始之前你需要有PHP和C语言/C++基础
掌握Linux下编译安装PHP
本次使用PHP7.4进行扩展开发
在Linux上安装PHP7.4环境
根据你的个人习惯,使用Centos、Ubuntu或其它系统均可。
参考资料:
下载PHP源码包
下载源码包:
1wget https://www.php.net/distributions/php-7.4.4.tar.gz
如果下载速度太慢,可以使用国内的地址:
1wget https://share-disk-1252104623.cos.ap-guangzhou.myqcloud.com/php-7.4.4.tar.gz
下载完成后,解压源代码,进入源代码的扩展目录:
1
2tar zxvf php-7.4.4.tar.gz
cd php-7.4.4/ext
生成扩展开发的基本骨架
在扩展目录(ext)中,有一个ext_skel.php脚本,可以用于生成扩展开发的基本骨架。这个脚本是用PHP编写的,因此你需要提前安装好PHP环境。
执行脚本php ext_skel.php --help可以看到说明和常用参数。对于初学者来说,只需要了解--ext这个参数就够了。
创建一个叫做learn_ext的扩展:
1php ext_skel.php --ext learn_ext
顺利的话,会看到扩展开发的一些提示:
Copying config scripts… done
Copying sources… done
Copying tests… done
Success. The extension is now ready to be compiled. To do so, use the
following steps:
cd /path/to/php-src/learn_ext
phpize
./configure
make
Don’t forget to run tests once the compilation is done:
make test
Thank you for using PHP!
这个操作会在ext/目录下生成一个learn_ext目录,查看learn_ext目录中的文件如下:
1
2
3
4
5config.m4
config.w32
learn_ext.c
php_learn_ext.h
tests
我们主要关注的文件是learn_ext.c,这是扩展的源代码文件。在这个文件中,已经有两个函数的例子写在learn_ext.c里面了。
第一个函数:
1
2
3
4
5
6
7
8
9/* {{{
*/
PHP_FUNCTION(learn_ext_test1)
{
ZEND_PARSE_PARAMETERS_NONE();
php_printf("The extension %s is loaded and working!\r\n", "learn_ext");
}
/* }}} */
从注释中可以看出这个,函数原型是void learn_ext_test1(),一个没有参数也没有返回值的函数learn_ext_test1,函数运行后将会打印一句话:The extension learn_ext is loaded and working!。
第二个函数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17/* {{{ string learn_ext_test2( [ string $var ] )
*/
PHP_FUNCTION(learn_ext_test2)
{
char *var = "World";
size_t var_len = sizeof("World") - 1;
zend_string *retval;
ZEND_PARSE_PARAMETERS_START(0, 1)
Z_PARAM_OPTIONAL
Z_PARAM_STRING(var, var_len)
ZEND_PARSE_PARAMETERS_END();
retval = strpprintf(0, "Hello %s", var);
RETURN_STR(retval);
}
同样,注释中标注了函数原型是string learn_ext_test2( [ string $var ] ),即参数是一个字符串类型的可选参数,返回值也是一个字符串。
从源代码可以看出来,这个函数会返回Hello %s,其中%s是参数var。var参数是可选的,如果没有传入参数,则使用默认值char *var = "World";,最后返回字符串Hello World。
编译扩展
根据上面创建扩展骨架时的提示:
The extension is now ready to be compiled. To do so, use the
following steps:
cd /path/to/php-src/learn_ext
phpize
./configure
make
按照提示中的流程,进入到learn_ext扩展目录,使用phpize命令编译扩展:
1
2
3
4
5root@ed78d89e5328:~/php-7.4.4/ext/learn_ext# phpize
Configuring for:
PHP Api Version: 20190902
Zend Module Api No: 20190902
Zend Extension Api No: 320190902
检查并生成编译配置:
1./configure
编译扩展:
1make
很快,编译完成。顺利的话,在learn_ext扩展目录下的modules目录,会生成一个learn_ext.so,这个就是最终生成的扩展二进制文件。
安装扩展
编辑PHP配置文件php.ini,增加一行扩展配置:
1extension=/root/php-7.4.4/ext/learn_ext/modules/learn_ext.so
测试扩展是否生效
以下几种方法都可以验证扩展是否安装成功:
不用重启PHP,使用php -m命令打印已安装的扩展,可以找到learn_ext说明扩展安装成功。
1
2root@ed78d89e5328:~# php -m |grep learn_ext
learn_ext
创建一个PHP脚本test.php,可以调用扩展里面的方法:
1
2
3
4
5
6
7<?php
learn_ext_test1();
echo "\n";
echo learn_ext_test2();
echo "\n";
echo learn_ext_test2("learn_ext");
echo "\n";
保存后,执行php test.php, 输出:
The extension learn_ext is loaded and working!
Hello World
Hello learn_ext
查看phpinfo():
1
2
3root@ed78d89e5328:~# php -r "phpinfo();"|grep learn_ext
learn_ext
learn_ext support => enabled
如果是在网页中查看phpinfo, 需要重启php-fpm或nginx/apache。
下一步
以上就是扩展开发和安装的流程。
php7扩展开发教程,Linux下PHP7扩展开发入门教程1:扩展开发流程相关推荐
- linux c++编程教程,Linux下的C++编程入门教程.ppt
<Linux下的C++编程入门教程.ppt>由会员分享,可在线阅读,更多相关<Linux下的C++编程入门教程.ppt(14页珍藏版)>请在人人文库网上搜索. 1.Linux下 ...
- linux下的c 编程入门教程,Linux下的C编程入门教程.ppt
<Linux下的C编程入门教程.ppt>由会员分享,可在线阅读,更多相关<Linux下的C编程入门教程.ppt(14页珍藏版)>请在装配图网上搜索. 1.Linux下c+编程, ...
- Linux redis安装教程,Linux 下redis5.0.0安装教程详解
Linux redis5.0.0安装,教程如下所示: 1.从官网下载,然后传到服务器,tar -zxvf解压 2.进入redis ? 3.安装:make, (1)若提示:: gcc: Command ...
- php5.4 zend安装教程,linux下php5.4安装Zend Guard Loader扩展
从PHP5.3开始如果要支持ZendGuard加密的PHP代码,必须安装Zend Guard Loader,老的zend optimizer将不被支持. 1.Zend Guard Loader安装 [ ...
- linux 开发板模拟u盘,S5P4418开发板Linux下实现模拟U盘教程飞凌嵌入式
飞凌嵌入式ARMCortex-A9 S5P4418开发板上能否满足U盘的功能?其实可通过修改内核配置和文件系统相关内容,在OK4418开发板上实现模拟U盘功能,模拟U盘可以帮助我们实现开发板与Wind ...
- linux下github使用教程,Linux下git操作GitHub步骤教程
1.安装git sudo apt-get install git-core git-gui git-doc 2.在客户端安全登陆 cd ~/.ssh 如果提示"没有文件目录",说明 ...
- Linux下shel脚本之批量修改文件扩展名
Linux下shel脚本之批量修改文件扩展名 一.脚本要求 二.脚本内容 三.运行脚本 一.脚本要求 二.脚本内容 三.运行脚本 一.脚本要求 1.在/data/tmp/下的所有文件扩展名改为.py ...
- Linux下安装Nginx详细图解教程
Linux下安装Nginx详细图解教程 什么是Nginx? Nginx ("engine x") 是一个高性能的 HTTP 和 反向代理 服务器,也是一个 IMAP/POP3/SM ...
- proc除了能用于oracle开发_能不能用于mysql开发_Oracle数据库开发(二).Linux下配置使用ProC...
一.提要 上文简单介绍了Windows下ProC配置开发,这次我们使用Linux平台再次配置Oracle ProC开 发环境(RedHat Linux 9 + Oracle 92). <ORAC ...
最新文章
- 如何利用计算机计算天数,如何应用Win10系统电脑中的计算器计算两个日期之间的天数?...
- 阿里巴巴开源 Dragonwell JDK 最新版本 8.1.1-GA 发布
- (一)html5中的新增元素和废除元素
- 第49讲:实战上手,Scrapy-Redis 分布式实现
- Apache Cassandra和Apache Ignite:关系并置和分布式SQL
- oracle 多路径 SAN,前言 - Oracle Solaris 管理:SAN 配置和多路径
- aria-hidden读屏
- Chapter 1 First Sight——13
- 寄存器位读写,结构体位域定义,位域操作,位操作
- win10系统怎么改奇摩输入法_Yahoo! 奇摩输入法
- 蓝牙AOA融合定位技术汇总
- 最好的科普著作《追寻记忆的痕迹》——神经与精神的历史和未来
- 姜小白的Python日记Day14 系统模块详解1 time模块和random模块
- 【猿说VUE】条件渲染,绝代双骄之 v-if 和v-show
- 当代最值得收藏的画家作品_当代最具收藏价值的画家:许敬如作品欣赏
- ImagePicker
- Linux专家警告开源软件日益吸引黑客
- Vue手把手带你入门(一) nodejs安装配置以及vue-cli脚手架创建第一个vue项目(超级详细)
- STM32红外寻迹小车
- Http的多线程下载
热门文章
- [数字后端]LVT, RVT, HVT 的区别
- [玩转UE4/UE5动画系统>应用篇>功能模块] 之 Foot IK系统(ALS V4实现方案详解)
- 毕业前夕清华EMBA课程暨论文写作大总结
- 如何有理有据地给元宇宙泼一盆冷水?
- jquery循环获取元素
- windows下Python3安装PyChecker模块
- 从事金融行业需要考什么证书?
- 2021阿里云金融数据智能峰会——阿里巴巴数据中台建设经验之谈
- 教程 | 学好简笔画,再学画漫画
- 今天19:30 | 科普大佬说——青少年的AI修炼手册