您好,欢迎来到码863代码分享网! 请[登录] / [注册]

极简用C语言写一个PHP扩展

编辑

之前发过几篇文章都是关于一些运维方向的。想必比较枯燥!那么今天正好有时间聊点儿关于开发的有趣事情。

说起PHP这门语言,做web开发的朋友应该不会太陌生,经常会被调侃为“世界上最好的语言”。至于为啥说PHP是世界上最好的语言,在这里我就不唠叨了。因为也不是咱们今天的主题。大家有兴趣可以自己研究研究。

在工作中我会经常使用一些计算机语言来开发一些软件,刚才说的PHP就在其中。标题中的C语言也是其中一种语言。(说起C语言大家都不陌生)

那么有时候一当一种语言满足不了我的需求的时候就可能会考虑与其他的语言协作。那么今天我就说一下如何使用C语言开发一个PHP扩展。

首先我先抛出几个问题:

  1. 学了C语言到底能有啥用

  2. 为啥要用C语言给php写扩展

  3. 如何用C语言给php写扩展(重点)

一、学了C语言有啥用?

这个问题在我上学的时候我就问过自己,尴尬的是直到毕业后工作了才搞明白一丢丢。后来在我做学院外聘讲师的时候也有学生问过我,直到现在也都有人会起问我。

那么今天我在这里简单说一下有啥用:

  1. 首先我们要明白C语言为啥被称为高级语言中的低级语言。在这里我就用大白话和大家说:用它写一个程序比汇编语言效率高,比高级语言(java、php等)效率低。

  2. 学习了c语言可以更好的对计算机内存进行管理写出高质量的程序,也可以更好的对计算机底层、原理进行一些深刻的认识。这样对后期的开发工作很有帮助。

  3. 学习c语言是一个打基础的过程,基础打好了后期编写程序的过程中也会如鱼得水。

二、为啥要用C语言给php写扩展?

  1. 用原生php编写的程序性能达到了一定的瓶颈。

  2. 用于替换php中反复用到的一些公共的用php写的函数,如:接口数据输出、数据的接收方式等。

  3. 不同系统中的数据的共享,编写消息队列中间件、数据库连接池等。

  4. 其他还有很多,可以在实际工作中体会。

三、如何用c语言给php写扩展(重点)

好了说了半天了,那我们就开始用c语言编写一个php扩展吧。

首先我们需要具备的知识:C语言基础语法、php基础语法、Linux基础、php的模块编译安装

有了以上的基础,我们就可以开始编写扩展了。我把内容分为五个步骤:

  1. 下载php源码、生成php扩展框架

  2. php扩展框架讲解

  3. 编写几个简单的php扩展函数

  4. 编译安装

  5. 测试运行

一、mac下打开终端

        下载:wget https://www.php.net/distributions/php-7.1.33.tar.gz

        解压:tar -zxvf  php-7.1.33.tar.gz

        进入扩展目录:cd php-7.1.33-src/ext/

        执行:./ext_skel 会有一些说明,如图一。我们看到有一个选项:--extname=module选项,解释说明了module为扩展名称,现在我们执行 ./ext_skel --extname=test_add。这里的test_ddd就是我们的扩展名字

1697178177650895.png

二、扩展框架讲解

    执行完./ext_skel --extname=test_add后,在我门的目录下生成了一个test_add的文件夹,这个文件夹中的各种文件就是我们php的扩展框架。我们可以用vscode打开他,看看目录结构。

1697178443772560.png

这里我们看到有几个文件还有一个文件夹,这里我着重介绍几个文件,首先是config.m4,这个文件是用来生成configure脚本、Makefile等文件。还有是test_add.c这个就是我们扩展的主文件,在里面可以写一些我们的业务代码。php_test_add.h这个一看就是头文件,里面主要定义了一些宏,方便我们扩展的开发。

好了,既然test_add.c是扩展的主文件,那么我们打开他看一下,在这里面我们可以看到头部引入了一些.h的头文件。其中有:php.h、php_ini.h等、还有刚才提到的php_test_add.h

往下看有几个宏,主要的几个是:PHP_FUNCTION、PHP_MINIT_FUNCTION、PHP_MSHUTDOWN_FUNCTION、PHP_RINIT_FUNCTION、PHP_RSHUTDOWN_FUNCTION、PHP_MINFO_FUNCTION

另外还有一个test_add_functions。

三、编写几个简单的php扩展函数

今天我们要用的主要有一个宏PHP_FUNCTION,还有test_add_functions。其他的宏后面有机会在和大家聊。因为我们今天的主要目的是写几个扩展函数,让跑起来。

1)PHP_FUNCTION宏:

我们可以把我们要定义的函数名字作为参数然后写入这个宏中,如:

1697178541317742.png

在上图中我把之前默认的函数名字改为了test_add_1后又新增了一个函数test_add_2。然后我们会在PHP_FUNCTION(test_add_2)中把这个函数完善一下(这个函数的主要功能是让两个数相加然后把结果返回给用户,就这么简单)

1-1)首先我们定义两个长整型:long a, b;

1-2)然后通过:zend_parse_parameters函数接收他们

1-3)定义一个long c,然后让a, b相加赋值给c

1-4)输出c

1697178640714062.png

2)test_add_functions:(php8.1搜索test1,在.stub文件中加函数)

我们在它的上面可以看到一句话:Every user visible function must have an entry in test_add_functions[]. 也就是说我们在上面创建了函数还不能让客户端PHP使用必须在PHP_FE这个宏里指定了才可以

1697179124111200.jpeg

以上就是我们定义两个函数的名字:test_add_1、test_add_2

四、编译安装

我们开始要编译了,在编译之前我们需要生成一下Makefile等文件,下来执行:phpize,这时候我们的扩展目录下会多出好多文件,其中就有configure,好的我们执行./configure,最后我们再执行:make && make install。看到下图说明我们就编译安装成功了。

1697179271445470.png

最后我们再php.ini中配置我们的扩展

最后一行添加:extension = test_add.so

重启Apache

五、测试运行

  1. 我们执行php -m会看到刚才我们编写的扩展,下图:

    1697179378786832.png

  2. 我们在终端输入 php -r "test_add_2(1,2);"

    1697179681960377.png


好了,这里就结束了,后期有时间会和大家分享其他宏、变量、数据类型的定义等。


CopyRight 2002~2023 精通2100网 联系邮箱:qqtxt@163.com
版权所有:精通2100网 湘ICP备2023018646号-1
MYSQl共执行 3 个查询,用时 0.11870336532593 秒,PHP脚本用时 0.121403 秒,占用内存 0.652 MB,Gzip 已启用