PHP扩绽开发入门教程_

上传人:m**** 文档编号:431176176 上传时间:2023-07-20 格式:DOCX 页数:11 大小:16.34KB
返回 下载 相关 举报
PHP扩绽开发入门教程__第1页
第1页 / 共11页
PHP扩绽开发入门教程__第2页
第2页 / 共11页
PHP扩绽开发入门教程__第3页
第3页 / 共11页
PHP扩绽开发入门教程__第4页
第4页 / 共11页
PHP扩绽开发入门教程__第5页
第5页 / 共11页
点击查看更多>>
资源描述

《PHP扩绽开发入门教程_》由会员分享,可在线阅读,更多相关《PHP扩绽开发入门教程_(11页珍藏版)》请在金锄头文库上搜索。

1、PHP扩绽开发入门教程_ 这篇文章主要介绍了PHP扩绽开发入门教程,本文讲解了用法C语言在Linux系统下开发一个PHP扩展应当具备的最基本学问,需要的伴侣可以参考下 PHP扩绽开发 我预备在此系列博文中总结我有关PHP扩绽开发的学习和感悟,力图简洁清楚地描述在Linux系统下开发一个PHP扩展应当具备的最基本学问。水平较低,难免有错误,望指出。 预备工作 首先要猎取一份PHP源码(可以从Github上签出,或者到官网上下载最新的稳定版),然后编译之。为了加快编译速度,我们推举禁用全部额外的扩展(用法-disable-all选项),但最好打开debug(用法-enable-debug选项)和线

2、程平安(用法-enable-maintainer-zts),但要在发布扩展的时候关闭debug,视状况选择是否需要打开线程平安: 代码如下: $ ./buildconf -force $ ./configure -disable-all -enable-debug -enable-maintainer-zts $ make 留意,我们没有指定-prefix选项(同时也没有make install),由于这不是必需的。留意查看输出信息,或许你需要安装一些依靠包才能胜利编译PHP。 编译后的PHP的可执行程序在源码的sapi名目下,对应不同的宿主环境有不同的子名目,我们以后都主要用法cli(com

3、mand line interface)环境,可以建一个别名便利引用: 代码如下: $ alias php-dev=/usr/local/src/php-5.6.5/sapi/cli/php 有一些指令行选项是很有用的: 代码如下: php-dev -h# 打印关心信息 php-dev -v# 打印版本信息 php-dev -ini# 打印配置信息 php-dev -m# 打印加载的模块信息 php-dev -i# phpinfo php-dev -r code# 执行code里的代码 扩展骨架 PHP的全部官方扩展都在源码的ext名目下,我们自己写的扩展也可以放在该名目下。留意,该名目下有个

4、名为ext_skel的shell脚本,它是用来生成PHP扩展骨架的,用法该脚本,可以帮我们快速创建PHP扩展: 代码如下: $ ./ext_skel -extname=myext 上面的指令帮我们创建了一个名为myext的扩展,源码在myext名目下。不带任何参数的执行该脚本可以打印关心信息,这样你可以查看到该脚本供应的更多选项。 接下来让我们完成我们的扩展。进入myext名目,编辑config.m4配置文件,找到PHP_ARG_ENABLE宏函数,去掉前面的dnl说明(共三行)。退回到源码根名目,重新执行buildconf、configure和make指令: 代码如下: $ ./buildc

5、onf -force $ ./configure -help | grep myext -enable-myext Enable myext support $ ./configure -disable-all -enable-myext -enable-debug -enable-maintainer-zts $ make 留意,我们用./configure -help | grep myext打印了我们扩展的加载状况,假如看不到下面的输出,则说明我们的扩展没有配置胜利,回头检查下config.m4文件。 这次编译应当特别快,由于大部分代码都已经编译过了。PHP还有另外一种编译扩展的方法(用

6、法动态连接的方式,将扩展编译为.so的文件),不过我们推举在开发扩展的时候用法静态编译,由于这样省去了在配置文件中加载扩展的步骤。 一切顺当的话,我们的第一个扩展就已经可以执行了: 代码如下: $ php-dev -m | grep myext myext $ php-dev -r echo confirm_myext_compiled(myext) . n; Congratulations! You have successfully modified ext/myext/config.m4. Module myext is now compiled into PHP. 第一个指令显示了我们

7、的扩展已经被加载。其次个指令执行了ext_skel扩展骨架自动为我们创建的函数。当然,这个函数毫无意义,不过我们可以很简单的把这个函数改编成hello world。 手动创建扩展 大部分教程都是以ext_skel扩展骨架为原型讲解并描述扩绽开发的,这种做法当然很便利快捷。但是我个人更喜爱纯手工开发扩展的方式,由于这样更简单理解其中的每一个详情。 手动创建扩展,先进入ext名目,创建我们的扩展名目myext2。有几个文件是必需的:config.m4,myext2.c和php_myext2.h。 首先,我们来编写配置文件config.m4: 代码如下: PHP_ARG_ENABLE(myext2,

8、 whether to enable myext2 support, -enable-myext2 Enable myext2 support) if test PHP_MYEXT2 != no; then PHP_NEW_EXTENSION(myext2, myext2.c, $ext_shared) fi config.m4其实是autoconf程序用法的配置文件,autoconf是autotools工具箱里重要的组成。完整介绍autoconf的用法是需要很长时间的,好在我们这里的用法特别简洁。 PHP_ARG_ENABLE是PHP为autoconf定义的宏函数,myext2是它的第一个参

9、数,指出了扩展的名字;后面两个参数只是在make和configure执行时用来显示的,所以我们可以任凭写。 在autoconf语法中的作用类似于双引号,用来包裹字符串(留意其次个参数中包含了空格,但是可以不用方括号起来)。还有第四个参数用来指明扩展默认是开启还是关闭(yes或no),默认是no。 下面三行其实就是shell语法,推断我们是否开启了PHP_MYEXT2扩展模块。假如开启了该扩展模块(-enable-myext2),则$PHP_MYEXT2变量的值不为no,因此执行PHP_NEW_EXTENSION宏。这个宏函数也是PHP为autoconf定义的扩展语法,第一个参数同样是扩展名称;

10、其次个参数是扩展要编译的C文件,假如有多个,依次写下去就可以了(空格分隔);第三个参数固定是$ext_shared。 接下来编写php_myext2.h头文件,该文件的命名是PHP扩展的规范 php_扩展名.h: 代码如下: #ifndef PHP_MYEXT2_H #define PHP_MYEXT2_H extern zend_module_entry myext2_module_entry; #define phpext_myext2_ptr myext2_module_entry #define PHP_MYEXT2_VERSION 0.1.0 /* prototypes */ PHP

11、_FUNCTION(hello); #endif /* PHP_MYEXT2_H */ 这里主要的代码是定义了名为phpext_myext2_ptr的宏,PHP底层通过该宏来引用我们的扩展。可以看出,该宏的命名同样是有规范的 phpext_扩展名_ptr。而myext2_module_entry是我们稍后要在.c文件里定义的结构体,它的命名也是规范的 扩展名_module_entry。 此外我们还定义了一个标识我们扩展版本号的宏和一个函数原型(通过PHP_FUNCTION宏,PHP_FUNCTION宏函数的参数是外部可用法的函数名),稍后我们会来实现这个函数。 最终来看下myext2.c文件的

12、实现: 代码如下: #include php.h #include php_myext2.h /* myext2_functions * * Every user visible function must have an entry in myext2_functions. */ static const zend_function_entry myext2_functions = PHP_FE(hello, NULL) PHP_FE_END ; /* */ /* myext2_module_entry */ zend_module_entry myext2_module_entry = S

13、TANDARD_MODULE_HEADER, myext2, /* module name */ myext2_functions, /* module functions */ NULL, /* module initialize */ NULL, /* module shutdown */ NULL, /* request initialize */ NULL, /* request shutdown */ NULL, /* phpinfo */ PHP_MYEXT2_VERSION, /* module version */ STANDARD_MODULE_PROPERTIES ; /*

14、 */ #ifdef COMPILE_DL_MYEXT2 ZEND_GET_MODULE(myext2) #endif /* proto void hello() Print hello world! */ PHP_FUNCTION(hello) php_printf(hello world!n); /* */ 对比下扩展骨架创建的.c文件就会发觉,我们的.c文件特别的简洁,其实这些对一个最基本的扩展来说就已经足够了。 上面的代码是简洁而清楚的,大部分说明已经很具说明性了。我们再简要概括下: 1.开头包含我们要用到的头文件。php.h是必需的,它已经帮我们包含了我们会用到的绝大多数的标准库文件,比如stdio.h,stdlib.h等等。 2.myext2_functions定义了由我们要暴露出去的函数构成的结构体数组,每一个元素通过PHP_FE宏来指定。PHP_FE宏有两个参数,第一个是外部可用法的函数名,其次个是参数信息(这里我们简洁用法了NULL),最终一个元素必需是PHP_FE_END。留意它的说明,再次强调,每一个要暴露给外部用法的函数,都必需在该结构体数组中有定义。 3.myext2_module_e

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 工作计划

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号