首页 存档 技术 查看内容

【原创】PHP扩展开发入门

2018-3-30 13:00 |来自: 互联网 270 0

摘要: PHP扩展开发入门 作者:吴峰 (360电商技术组) 在我们编写自己的第一个php扩展之前,先了解一下php的整体架构和运行机制。 php的架构如图1所示。其中一个重要的就是SAPI(服务器端应用编程端口),它使得P ...

PHP扩展开发入门

作者:吴峰 (360电商技术组)

在我们编写自己的第一个php扩展之前,先了解一下php的整体架构和运行机制。


php的架构如图1所示。其中一个重要的就是SAPI(服务器端应用编程端口),它使得PHP可以和其他应用进行数据交互,把外部错综复杂的外部环境进行抽象化,为内部的php提供一套固定和统一的接口,使得php自身不受外部影响,保持一定的独立性。常见的SAPI有CGI,FastCGI,Shell的CLI,apache的mod_php5,IIS的ISAPI。

另外一个非常重要就是ZendEngine。Zend Engine是官方提供的PHP实现的核心,提供了语言实现上的基础设施,其他比较知名的还有facebook的hiphop实现。例如PHP的语法实现,脚本的编译运行环境,扩展机制以及内存管理等。我们在后面编写php扩展时,也将基于Zend Engine。

PHP3时代还是采用边解释边执行的运行方式,这种方式运行效率很受影响,其次代码整体耦合度比较高,可扩展性也不够好。因此随着php在web应用开发中的普及,于是ZeevSuraski和Andi Gutmans决定重写代码以解决这两个问题,最终他们俩把该项技术的核心引擎命名为Zend Engine 。

Zend Engine最主要的特性就是把PHP的边解释边执行的运行方式改为先预编译(Compile),再执行(Execute)。这两者的分开给 PHP 带来了**性的变化:执行效率大幅提高。由于实行了功能分离,降低了模块间耦合度,可扩展性也大大增强。

目前PHP的实现和Zend Engine之间的关系非常紧密,例如很多PHP扩展都是使用的Zend API,而Zend正是PHP语言本身的实现,PHP只是使用Zend这个内核来构建PHP语言的,而PHP扩展大都使用Zend API,这就导致PHP的很多扩展和Zend引擎耦合在一起了,后来才有PHP核心开发者就提出将这种耦合解开的建议。不过下面我们还下面在Zend Engine的基础上开始编写我们第一个简单的php扩展。

1.配置文件

每一个PHP扩展都至少需要一个配置文件和一个源文件。配置文件用来告诉编译器应该编译哪几个文件,以及编译本扩展是否需要的其它库文件。

在php源码文件夹的ext目录下创建一个新的文件,扩展的名字取作myfirst。然后在这个目录下创建一个config.m4文件,并输入以下内容:

PHP_ARG_ENABLE(

myfirst,

[Whether to enable the "myfirst" extension],

[enable-myfirst Enable"myfirst" extension support])

if test $PHP_Myfirst !="no"; then

PHP_SUBST(Myfirst_SHARED_LIBADD)

PHP_NEW_EXTENSION(myfirst, myfirst.c, $ext_shared)

fi

上面PHP_ARG_ENABLE函数有三个参数,第一个参数是我们的扩展名(注意不用加引号),第二个参数是当我们运行./configure脚本时显示的内容,最后一个参数则是我们在调用./configure--help时显示的帮助信息。PHP_SUBST函数只是php官方对autoconf中AC_SUBST函数的一层封装。PHP_NEW_EXTENSION函数声明了这个扩展的名称、需要的源文件名、扩展的编译形式。如果扩展使用了多个文件,可以将文件名罗列在函数的参数里,如:PHP_NEW_EXTENSION(sample, sample.c sample2.c sample3.c, $ext_shared)最后的$ext_shared参数用来声明这个扩展为动态库,在php运行时动态加载的。

2.源文件

在完成了配置文件后,下面的就是完成扩展主逻辑的头文件和C文件。

头文件

//php_myfirst.h

#ifndef Myfirst_H

#define Myfirst_H

//加载config.h,如果配置了的话

#ifdef HAVE_CONFIG_H

#include "config.h"

#endif

//加载php头文件

#include "php.h"

#define phpext_myfirst_ptr

声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系 [邮箱地址] 删除

路过

雷人

握手

鲜花

鸡蛋

相关分类

返回顶部