本文将会基于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:扩展开发流程相关推荐

  1. linux c++编程教程,Linux下的C++编程入门教程.ppt

    <Linux下的C++编程入门教程.ppt>由会员分享,可在线阅读,更多相关<Linux下的C++编程入门教程.ppt(14页珍藏版)>请在人人文库网上搜索. 1.Linux下 ...

  2. linux下的c 编程入门教程,Linux下的C编程入门教程.ppt

    <Linux下的C编程入门教程.ppt>由会员分享,可在线阅读,更多相关<Linux下的C编程入门教程.ppt(14页珍藏版)>请在装配图网上搜索. 1.Linux下c+编程, ...

  3. Linux redis安装教程,Linux 下redis5.0.0安装教程详解

    Linux redis5.0.0安装,教程如下所示: 1.从官网下载,然后传到服务器,tar -zxvf解压 2.进入redis ? 3.安装:make, (1)若提示:: gcc: Command ...

  4. php5.4 zend安装教程,linux下php5.4安装Zend Guard Loader扩展

    从PHP5.3开始如果要支持ZendGuard加密的PHP代码,必须安装Zend Guard Loader,老的zend optimizer将不被支持. 1.Zend Guard Loader安装 [ ...

  5. linux 开发板模拟u盘,S5P4418开发板Linux下实现模拟U盘教程飞凌嵌入式

    飞凌嵌入式ARMCortex-A9 S5P4418开发板上能否满足U盘的功能?其实可通过修改内核配置和文件系统相关内容,在OK4418开发板上实现模拟U盘功能,模拟U盘可以帮助我们实现开发板与Wind ...

  6. linux下github使用教程,Linux下git操作GitHub步骤教程

    1.安装git sudo apt-get install git-core git-gui git-doc 2.在客户端安全登陆 cd ~/.ssh 如果提示"没有文件目录",说明 ...

  7. Linux下shel脚本之批量修改文件扩展名

    Linux下shel脚本之批量修改文件扩展名 一.脚本要求 二.脚本内容 三.运行脚本 一.脚本要求 二.脚本内容 三.运行脚本 一.脚本要求 1.在/data/tmp/下的所有文件扩展名改为.py ...

  8. Linux下安装Nginx详细图解教程

    Linux下安装Nginx详细图解教程 什么是Nginx? Nginx ("engine x") 是一个高性能的 HTTP 和 反向代理 服务器,也是一个 IMAP/POP3/SM ...

  9. proc除了能用于oracle开发_能不能用于mysql开发_Oracle数据库开发(二).Linux下配置使用ProC...

    一.提要 上文简单介绍了Windows下ProC配置开发,这次我们使用Linux平台再次配置Oracle ProC开 发环境(RedHat Linux 9 + Oracle 92). <ORAC ...

最新文章

  1. 如何利用计算机计算天数,如何应用Win10系统电脑中的计算器计算两个日期之间的天数?...
  2. 阿里巴巴开源 Dragonwell JDK 最新版本 8.1.1-GA 发布
  3. (一)html5中的新增元素和废除元素
  4. 第49讲:实战上手,Scrapy-Redis 分布式实现
  5. Apache Cassandra和Apache Ignite:关系并置和分布式SQL
  6. oracle 多路径 SAN,前言 - Oracle Solaris 管理:SAN 配置和多路径
  7. aria-hidden读屏
  8. Chapter 1 First Sight——13
  9. 寄存器位读写,结构体位域定义,位域操作,位操作
  10. win10系统怎么改奇摩输入法_Yahoo! 奇摩输入法
  11. 蓝牙AOA融合定位技术汇总
  12. 最好的科普著作《追寻记忆的痕迹》——神经与精神的历史和未来
  13. 姜小白的Python日记Day14 系统模块详解1 time模块和random模块
  14. 【猿说VUE】条件渲染,绝代双骄之 v-if 和v-show
  15. 当代最值得收藏的画家作品_当代最具收藏价值的画家:许敬如作品欣赏
  16. ImagePicker
  17. Linux专家警告开源软件日益吸引黑客
  18. Vue手把手带你入门(一) nodejs安装配置以及vue-cli脚手架创建第一个vue项目(超级详细)
  19. STM32红外寻迹小车
  20. Http的多线程下载

热门文章

  1. [数字后端]LVT, RVT, HVT 的区别
  2. [玩转UE4/UE5动画系统>应用篇>功能模块] 之 Foot IK系统(ALS V4实现方案详解)
  3. 毕业前夕清华EMBA课程暨论文写作大总结
  4. 如何有理有据地给元宇宙泼一盆冷水?
  5. jquery循环获取元素
  6. windows下Python3安装PyChecker模块
  7. 从事金融行业需要考什么证书?
  8. 2021阿里云金融数据智能峰会——阿里巴巴数据中台建设经验之谈
  9. 教程 | 学好简笔画,再学画漫画
  10. 今天19:30 | 科普大佬说——青少年的AI修炼手册