PHP扩展开发

我将总结我在这一系列博客中对PHP扩展开发的学习和理解,试图简单而清晰地描述在Linux系统下开发PHP扩展的最基本知识。

死的工作

首先,拿到一份PHP源代码(你可以登录从GitHub上,或在官方网站下载最新的稳定版),然后编译它。为了加快编译速度,我们建议扩展禁用所有其他(使用--禁用所有选项),但它是最好的打开调试(使用--启用调试选项)和线程安全(使用,使维护人员,但是ZTS)关闭调试时释放的膨胀,视情况选择是否需要打开一个线程安全的:

复制代码代码如下所示:

美元/ buildconf力。

美元。 /配置禁用--启用调试,使保持特稿

为使



注意,我们没有指定前缀选项(也没有make安装),因为没有必要。注意输出信息,也许您需要安装一些依赖项才能成功编译PHP。

编译PHP可执行程序在不同的宿主环境的不同子目录的源代码目录下的SAPI。稍后我们将主要使用CLI(命令行接口)环境,我们可以创建一个别名以方便引用。

复制代码代码如下所示:

$别名PHP开发= / usr /局部/ src / / / CLI SAPI php-5.6.5 / PHP



有一些命令行选项是有用的:

复制代码代码如下所示:

PHP开发H #打印帮助信息

PHP开发- V #打印版本信息

PHP开发,INI #打印配置信息

PHP开发M #打印信息模块加载

PHP开发-我# phpinfo

PHP开发# R代码执行代码



扩展的骨架

所有的PHP官方的扩展是在源代码的外部目录,和我们自己的延伸,也可以放在这个目录中,发现有一个shell脚本在这个目录下的ext_skel,用于生成PHP扩展的骨架。使用这个脚本,我们可以快速创建PHP扩展。

复制代码代码如下所示:

美元/ ext_skel -- extname = myext



上面的命令帮助我们创建一个扩展名为myext,在myext目录的源代码,脚本可以打印帮助信息没有任何参数,所以你可以看到更多的选项提供的脚本。

然后让我们完成我们的扩展。进入myext目录,编辑config.m4配置文件,找到php_arg_enable宏功能,删除以前的DNL注释(共三株),返回到源目录和执行buildconf,配置和命令:

复制代码代码如下所示:

美元/ buildconf力。

美元。 /帮助myext | grep

——使myext使myext支持

美元。 /配置--禁用所有--使myext --启用调试,使保持特稿

为使



注意我们使用。 /帮助的grep myext |打印负荷我们扩展,如果你没有看到下面的输出,那么我们的扩展配置不成功,请回来的config.m4文件下。

编译应该是非常快的,因为大部分的代码已经compiled.php有另一种方式编译和扩展(使用动态连接方式扩展文件等)。但是,我们建议在开发扩展时进行静态编译,因为它节省了在配置文件中加载和扩展的步骤。

如果一切顺利,我们可以进行第一次扩建。

复制代码代码如下所示:

PHP开发myext美元M grep |

myext

PHP开发r'echo美元confirm_myext_compiled(myext )。

祝贺你!您已成功修改分机 / / config.m4 myext。myext现在编译成模块



第一个命令显示我们的扩展已加载。第二命令执行自动为我们创造的ext_skel延伸骨架的功能。当然,这个功能是没有意义的,但是我们可以很容易地适应这个功能你好世界。

手动创建扩展

大部分的教程描述扩展开发的ext_skel延伸骨架,这当然是方便快捷,但我个人更喜欢纯手工开发的扩展,因为它是更容易理解它的每一个细节。

手动创建扩展,推进到ext目录,并创建扩展目录myext2。几个文件是必要的:config.m4,myext2。C,和php_myext2。H.

首先,让我们写配置文件config.m4:

复制代码代码如下所示:

php_arg_enable(myext2,是否启用myext2支持,

{——enable-myext2使myext2支持})

如果测试php_myext2 !=否;然后

php_new_extension(myext2,myext2。C,ext_shared美元)

FI



config.m4实际上是一个由autoconf程序使用的配置文件,和autoconf的autotools的工具箱的一个重要组成部分,它需要很长的时间来充分描述的autoconf使用,但它是非常简单的使用在这里。

php_arg_enable是由PHP进行定义的宏功能。myext2是它的第一个参数。它指出了扩展名。后两个参数只显示当使配置的执行,所以我们可以随意写。{ }在autoconf的句法功能类似于双引号,这是用来把字符串。(注意第二个参数包含空格,但它可以不用括号)。第四个参数用来表示扩展默认是打开还是关闭(是或否),默认值是no。

以下三行实际上是shell的语法,来决定我们是否有打开php_myext2扩展模块。如果扩展模块(-- enable-myext2)打开,php_myext2美元中的变量的值是不是没有,所以php_new_extension宏执行。这个宏功能也是一个扩展语法的PHP进行定义。第一个参数也是扩展名。第二个参数是扩展C的文件进行编译,如果有多个,它可以被写下来的顺序(间隔);第三个参数是ext_shared美元。

接下来,写php_myext2。h头文件,并命名为PHP扩展的规范php_延伸。H:

复制代码代码如下所示:

#则php_myext2_h

#定义php_myext2_h

外部zend_module_entry myext2_module_entry;

#定义phpext_myext2_ptr myext2_module_entry

#定义php_myext2_version0.1.0

原型

php_function(你好);

如果# php_myext2_h / * * /



这里主要的代码是一个宏phpext_myext2_ptr的定义,它是指我们扩展PHP的底部,你可以看到,该宏的名称也是一个标准的phpext_延伸,_ptr.and myext2_module_entry是结构,我们将定义在C文件,其命名也标准的扩展_module_entry。

此外,我们定义了一个宏和函数原型,确定我们的扩展版本号(通过php_function宏的php_function宏函数的参数是函数名,可以用于外部),稍后我们将实现这一功能。

最后,要在对myext2实施看看。C文件。

复制代码代码如下所示:

#包括PHP。H

#包括php_myext2。H

/ * myext2_functions { }

*

*每个用户可见的功能必须在myext2_functions {入口}。

* /

静态常量zend_function_entry myext2_functions { } = { {

php_fe(你好,null)

php_fe_end

};



/ * myext2_module_entry

* /

zend_module_entry myext2_module_entry = { {

standard_module_header,

myext2

myext2_functions,模块功能 / * * /

NULL,模块初始化

NULL,模块关闭

NULL,请求初始化

NULL,请求关机

空,phpinfo / * * /

php_myext2_version,模块版本 / * * /

standard_module_properties

};



# ifdef compile_dl_myext2

zend_get_module(myext2)

# endif

原始空白(hello)

打印你好世界!。

php_function(你好)

{

php_printf(你好世界!;

}





通过比较由扩展骨架创建的C文件,我们会发现我们的C文件非常简单,基本扩展就足够了。

上面的代码简单明了,大部分注释已经说明了问题:

1。第一个包含要使用的头文件。PHP。H是必要的,它帮助我们包括标准库文件的绝大部分我们都会使用,如stdio. h,h,等程序。

2.myext2_functions定义了函数,我们想暴露结构的数组,每个元素是由php_fe宏观规定,php_fe宏有两个参数,第一个是函数名,可以用于外部,二是参数信息(在这里我们简单地使用null),和最后一个元素必须是php_fe_end.note附注并再次强调每一功能被暴露在外的使用必须在结构数组的定义。

3.myext2_module_entry界定了我们的模块的信息,这是一个结构,和大部分的属性已被注释说明。注意在中间的五个函数指针,我们都简单地设置为null,我们会告诉他们如何在后续的博客。

的4.zend_get_module(myext2)宏功能是通过ifdef宏包含的,所以它是确定是否是它是否被调用。在什么情况下会被调用,什么情况下不会叫,在后续的博客会告诉。

5,我们实现了hello函数的最后几行代码。这很简单。打电话php_printf输出Hello World是完全一样的换行符,php_printf和printf。

6中的注释。而且,为了便于折叠编辑器的使用,我们建议你写这个笔记。

它涉及一些宏,如php_fe,php_fe_end,php_function等等。在随后的博客中完整地介绍这些宏是唯一的方法。最简单的方法是现在记住这些宏。

请注意,我们每个文件的名称、变量的名称、空格和缩进,以及注释都非常规范,遵循这些规范,这样我们就可以编写代码,而PHP代码本身更适合,我们建议您开发使用这种标准的PHP扩展。

最后,编译并运行我们的扩展:

复制代码代码如下所示:

美元/ buildconf力。

美元。 /帮助的grep myext2 |

——enable-myext2使myext2支持

美元。 /配置--禁用所有-- enable-myext2 --启用调试,使保持特稿

为使

PHP开发M美元grep myext2 |

myext2

PHP开发r'hello美元();

你好世界!