5分钟PHP扩展开发快速入门

简单点,先来实现一个PHP扩展的hello world。
注意,如下全部操做都是基于linux系统(推荐centos和ubuntu, Mac系统应该相似 ),PHP5.5以上,建议读者使用5.5以上版本测试本文例程,PHP内核是由C语言写成的,因此扩展基本也是用C/C++编写。
话很少说,请睇下面:

1、下载PHP源码到本地目录php

解压后进入PHP源码的ext目录,在此目录下有一个名为ext_skel的shell脚本文件。接下来咱们将使用它来生成咱们的扩展的基本骨架。固然,若是你够牛也能够不用它,直接本身编写必要的文件。linux

2、生成扩展的基本骨架nginx

在ext目录执行命令:git

./ext_skel --extname=foobar

若是在此目录没有写权限请自觉加sudo。命令执行完毕后输出:github

Creating directory foobar
Creating basic files: config.m4 config.w32 .svnignore foobar.c php_foobar.h CREDITS EXPERIMENTAL tests/001.phpt foobar.php [done].

To use your new extension, you will have to execute the following steps:

1.  $ cd ..
2.  $ vi ext/foobar/config.m4
3.  $ ./buildconf
4.  $ ./configure --[with|enable]-foobar
5.  $ make
6.  $ ./sapi/cli/php -f ext/foobar/foobar.php
7.  $ vi ext/foobar/foobar.c
8.  $ make

Repeat steps 3-6 until you are satisfied with ext/foobar/config.m4 and
step 6 confirms that your module is compiled into PHP. Then, start writing
code and repeat the last two steps as often as necessary.

人品好的话将看到上面的输出,这表示已成功生成名为foobar的PHP扩展的基本骨架,在当前目录生成了一个foobar的文件夹,咱们扩展的全部代码都将放在此目录下(使用了第三方的库的扩展另当别论)。先别着急弄懂上面提示的内容,之后你会知道的,就像小时候妈妈常常跟你说:等你长大了就懂了!shell

3、编辑config.m4文件apache

ls扩展目录foobar,发现里面有几个文件:ubuntu

config.m4  config.w32  CREDITS  EXPERIMENTAL  foobar.c  foobar.php  php_foobar.h  tests

用VIM打开扩展目录下的config.m4文件,找到下面几行:vim

16 dnl PHP_ARG_ENABLE(foobar, whether to enable foobar support,
17 dnl Make sure that the comment is aligned:
18 dnl [  --enable-foobar           Enable foobar support])

前面的数字是它所在的行数(下同),不是文件内容,去掉16和18行前面dnl字符,dnl注释开始,咱们要把这两行的注释符号去掉,17行不用管。wq保存文件。
config.m4文件其实有不少内容,初始入门教程就不仔细说明各部份内容,由于实在我也不太懂!它的做用是配置扩展的行为,好比说明扩展编译选项,是否使用第三方库,扩展的源码组成等等。centos

4、编辑php_foobar.h文件:声明一个函数

php_foobar.h是一个C头文件,咱们须要在这个头文件里声明一个方法
vim编辑php_foobar.h文件,找到下面这一行:

47 PHP_FUNCTION(confirm_foobar_compiled);  /* For testing, remove later. */

这上ext_skel工具生成扩展骨架的时候自动声明的一个函数,仅用于测试,你能够去掉,也能够保留!在这一行的下面添加一行:

48 PHP_FUNCTION(halo);

这就声明了一个名为halo的PHP空间的函数,在PHP的代码里就能够像普通函数同样调用它。固然,目前到这一步还不行,由于这里只是声明,尚未定义它的行为。咱们将在foobar.c文件中编写它的函数体。

4、编辑foobar.c文件:定义函数体

foobar.c是扩展主要实现的地方,找到下面几行:

41 const zend_function_entry foobar_functions[] = {
42     PHP_FE(confirm_foobar_compiled, NULL)       /* For testing, remove later. */
43     PHP_FE_END  /* Must be the last line in foobar_functions[] */
44 };

在42行下面添加PHP_FE(halo, NULL)。注意不要添加任何分号。以下:

41 const zend_function_entry foobar_functions[] = {
42     PHP_FE(confirm_foobar_compiled, NULL)       /* For testing, remove later. */
43     PHP_FE(halo, NULL)
44     PHP_FE_END  /* Must be the last line in foobar_functions[] */
45 };

这一步是向PHP空间注册一个函数,名字就是刚才在php_foobar.h文件声明的halo

接下来是真正编写halo函数实现的时候。
在文件末尾添加如下代码:

169 PHP_FUNCTION(halo){
170     php_printf("hello world!");
171 }

从代码看出:halo函数只是打印一串字符串hello world,不作其余任何事情。

foobar.c文件内容不少,每一个代码段都有相应的注释说明,仔细研究一下,应该仍是大概能懂是什么意思!若是看不明白也不要紧,仍是妈妈那句话:等你长大(看多)了就懂了

OK!编码完毕,下面就是把扩展编译进PHP,供PHP代码调用!

5、编译安装扩展

扩展编译分动态编译和静态编译两种方法!今天咱们先讨论动态编译。有兴趣的同窗能够自行研究一下静态编译是什么鬼!

在扩展目录中执行phpize命令。必定要在扩展的目录执行才有效,不然将获得一个错误提示。

若是提示没有找到命令,请检查系统没有安装php-dev工具集,若是是源码编译安装的PHP,通常在php的bin目录下面,若是经过yumapt安装的PHP请确认是否安装过php-dev或者php-devel,安装过的话应该直接就能运行phpize命令。也可经过find / -name phpize命令来找到phpize的路径,而后带路径执行,若是系统安装了多个版本的PHP,最好是指定路径的phpize来指定使用的PHP版本!还找不到的话就GOOGLE一下吧!

phpize命令的正常输出以下:

Configuring for:
PHP Api Version:         20121113
Zend Module Api No:      20121212
Zend Extension Api No:   220121212

它代表的是当前使用的PHP内核的版本。

执行完phpize命令,细心的你会发现扩展目录下多出了好多文件,个人意见是不用管这些文件是干吗用的,固然有兴趣也能够研究一下!

下一步就是configure,详细命令以下:

./configure --enable-foobar --with-config-path=/usr/local/php/bin/php-config

configure须要两个选项:--enable-foobar表示启用这个扩展; --with-config-path=/usr/local/php/bin/php-config, 指定了php-config的路径,通常源码编译安装的PHP和多版本环境都须要指定这个选项,aptyum安装的都是在默认路径,能够不特别指定。

configure以后又多了好多文件,再一次无视它们吧!命令输出好长的一陀东西。

configure完以后就是make了。
什么?command not found?先安装gccmake吧! 方法请Google!

顺利make完以后,会在扩展的目录下的modules子目录多了一个foobar.so的文件,
它就是咱们刚才编写的扩展的最终产物。聪明的你必定已经想到:这TM不就是个动态库吗?而我只能说:你说对了!动态编译产生的是动态库文件。

OK,扩展编译完了,须要在PHP中使用扩展,复制foobar.so的完整路径,vim打开PHP的配置文件php.ini,在文件的末尾加入如下内容:

extension=/root/php-5.5.38/ext/foobar/modules/foobar.so #这是在个人系统foobar.so路径

保存退出,重启一下php-fpm(或apache,nginx什么的,若是不肯定,就都重启吧!请不要在生产环境瞎搞)

有些人就忍不住要问一下了:为何有些扩展在php.ini的配置中不用带路径?其实咱们的扩展同样也是能够的。在make命令以后多执行一步:make install,若是不是root权限,请自觉加sudo或切到root用户下执行。扩展就会安装到相应PHP版本的默认扩展加载路径!而后在php.ini的配置中就只要简单写上扩展名加so便可.

extension=foobar.so

至此,一个简单的PHP扩展就完成了。是否是有点小激动?

下面验证一番,在WEB目录新建一个php文件,如info.php,写入以下代码:

<?php
phpinfo();

地球人都知道这个函数调用是作什么的吧?

在浏览器执行这个文件!看到如下输出就说明扩展安装成功了:
image

直接修改info.php文件吧,调用咱们刚才在扩展中定义的函数:

<?php
halo();

刷新浏览器,若是人品不太坏的话应该就能看到如下的输出:

hello world!

BingGo!
若是你以为这文章不错,请给我点个赞吧^_^!

6、扩展阅读

相关文章
相关标签/搜索