下一篇 » « 上一篇

编写自己的php扩展函数(一)

作者:爱好者    时间:2008-01-22    来源:php之家    点击:24965    本文共1篇文章 字体:[ ]

编写自己的php扩展函数(一)

P class=MsoNormal align=center>编写自己的php扩展函数

www.444p.com

Yorgo Sun 2002/01/22 www.444p.com

  www.444p.com

php程序写的时间长了,自然对他所提供的功能了如指掌,他所提供的一大堆功能,真是觉得很好用,但有时候会发现php也缺少一些功能,自己总是会产生为php添加一些自定义的功能的想法。久而久之,终于今天憋不住了,开始动手研究如何添加。 php学习之家

 

www.444p.com版权所有

下载一个php的源代码包,这里使用的是php 4.0.5版,解压后会看到php的根目录下会有README.EXT_SKEL这样一个文件,打开详细阅读了一下,发现了一个非常好用的工具,这个工具可以帮你构建一个空的php扩展,然后你向里面添加相应的代码就可以完成你自己的功能扩展了。下面我们就来介绍如何使用这个工具。 本文来自 www.444p.com

  本文来自 www.444p.com

首先转移你的目录到php的目录下的ext目录,如果你只需要一个基本的扩展框架的话,执行下面的命令: www.444p.com php学习之家

./ext_skel --extname=module_name php学习之家http://www.444p.com

module_name是你自己可以选择的扩展模块的名字,例如我选择的my_module。执行工具后会自动在ext目录下建立你选择的module_name名字的目录,里面已经生成了相关的代码,这些代码中只需要调整config.m4文件中的三行注释就可以正常的编译带这个自定义扩展模块的php了。在php的根目录执行下列操作就可以得到。 本文来自 www.444p.com

./buildconf php学习之家

./configure --enable-module_name php学习之家http://www.444p.com

make www.444p.com版权所有

 

本文来自 www.444p.com

下面我来演示建立my_module扩展框架的全过程,为了更有效果,我们来完成一个php的扩展功能,在php中调用这个功能可以在web页面中显示hello world这个经典单词。

php学习之家http://www.444p.com

在php目录下的ext目录中,执行下面的命令

php学习之家http://www.444p.com

./ext_skel --extname=my_module www.444p.com

得到反馈结果:

php学习之家http://www.444p.com

Creating directory my_module www.444p.com php学习之家

Creating basic files: config.m4 Makefile.in .cvsignore my_module.c php_my_module.h tests/001.phpt my_module.php [done].

本文来自 www.444p.com

  www.444p.com版权所有

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

www.444p.com

1.  $ cd ..

本文来自 www.444p.com

2.  $ vi ext/my_module/config.m4

php学习之家http://www.444p.com

3.  $ ./buildconf www.444p.com版权所有

4.  $ ./configure --[with|enable]-my_module

www.444p.com

5.  $ make

php学习之家

6.  $ ./php -f ext/my_module/my_module.php

php学习之家http://www.444p.com

7.  $ vi ext/my_module/my_module.c

php学习之家http://www.444p.com

8.  $ make php学习之家

  www.444p.com php学习之家

Repeat steps 3-6 until you are satisfied with ext/my_module/config.m4 and www.444p.com

step 6 confirms that your module is compiled into PHP. Then, start writing www.444p.com版权所有

code and repeat the last two steps as often as necessary.

  www.444p.com版权所有

如果你能看懂上面的东西,那就照着去做。如果不是太明白的话,按照我下面的提示来做也可以。 本文来自 www.444p.com

Cd my_module php学习之家http://www.444p.com

首先进入my_module目录

vi config.m4

www.444p.com

使用文本编辑器打开config.m4文件,文件内容大致如下:

php学习之家

dnl $Id$

php学习之家http://www.444p.com

dnl config.m4 for extension my_module

本文来自 www.444p.com

dnl don't forget to call PHP_EXTENSION(my_module) php学习之家

  php学习之家http://www.444p.com

dnl Comments in this file start with the string 'dnl'. php学习之家

dnl Remove where necessary. This file will not work

www.444p.com php学习之家

dnl without editing. www.444p.com php学习之家

 

本文来自 www.444p.com

dnl If your extension references something external, use with: php学习之家http://www.444p.com

 

dnl PHP_ARG_WITH(my_module, for my_module support,

php学习之家

dnl Make sure that the comment is aligned:

www.444p.com版权所有

dnl [  --with-my_module             Include my_module support]) php学习之家http://www.444p.com

 

dnl Otherwise use enable:

php学习之家

 

php学习之家

dnl PHP_ARG_ENABLE(my_module, whether to enable my_module support, www.444p.com版权所有

dnl Make sure that the comment is aligned: php学习之家http://www.444p.com

dnl [  --enable-my_module           Enable my_module support]) 本文来自 www.444p.com

  php学习之家

if test "$PHP_MY_MODULE" != "no"; then

  dnl If you will not be testing anything external, like existence of

www.444p.com版权所有

  dnl headers, libraries or functions in them, just uncomment the php学习之家http://www.444p.com

  dnl following line and you are ready to go.

本文来自 www.444p.com

  dnl Write more examples of tests here...

php学习之家

  PHP_EXTENSION(my_module, $ext_shared)

php学习之家http://www.444p.com

Fi www.444p.com

 

www.444p.com

根据你自己的选择将 www.444p.com

dnl PHP_ARG_WITH(my_module, for my_module support,

本文来自 www.444p.com

dnl Make sure that the comment is aligned:

www.444p.com版权所有

dnl [  --with-my_module             Include my_module support]) 本文来自 www.444p.com

修改成 php学习之家http://www.444p.com

PHP_ARG_WITH(my_module, for my_module support,

www.444p.com版权所有

Make sure that the comment is aligned: php学习之家

[  --with-my_module             Include my_module support])

php学习之家

或者将

dnl PHP_ARG_ENABLE(my_module, whether to enable my_module support, www.444p.com

dnl Make sure that the comment is aligned: www.444p.com php学习之家

dnl [  --enable-my_module           Enable my_module support])

www.444p.com版权所有

修改成

php学习之家

PHP_ARG_ENABLE(my_module, whether to enable my_module support,

php学习之家

Make sure that the comment is aligned: 本文来自 www.444p.com

[  --enable-my_module           Enable my_module support])

php学习之家http://www.444p.com

  www.444p.com php学习之家

一般我会选择后者,然后保存退出。如果你对vi文本编辑器的操作有困难的话,请参考相应的说明文章,这里就不再详细描述了。

本文来自 www.444p.com

Vi my_module.c

php学习之家http://www.444p.com

将文件其中的下列代码进行修改 www.444p.com php学习之家

/* Every user visible function must have an entry in my_module_functions[].

本文来自 www.444p.com

*/

www.444p.com

function_entry my_module_functions[] = { www.444p.com版权所有

        PHP_FE(say_hello,       NULL)  /* ß添加着一行代码 */ php学习之家

        PHP_FE(confirm_my_module_compiled,      NULL) /* For testing, remove later. */

www.444p.com版权所有

        {NULL, NULL, NULL}      /* Must be the last line in my_module_functions[] */ php学习之家

}; www.444p.com版权所有

  www.444p.com

在文件的最后添加下列代码 www.444p.com

PHP_FUNCTION(say_hello) www.444p.com php学习之家

{

www.444p.com

        zend_printf("hello world\n");

www.444p.com

}

www.444p.com

保存文件退出 www.444p.com php学习之家

  www.444p.com版权所有

vi php_my_module.h

www.444p.com

在文件中PHP_FUNCTION(confirm_my_module_compiled);一行前面添加下面的代码 本文来自 www.444p.com

PHP_FUNCTION(say_hello);

www.444p.com

保存文件退出

php学习之家

  php学习之家

退回到php的根目录下,执行下面的命令 www.444p.com版权所有

./buildconf www.444p.com版权所有

./configure --enable-my_module php学习之家

make php学习之家http://www.444p.com

  php学习之家http://www.444p.com

如果一切顺利的话,我们现在已经将扩展模块my_module编译到php里面了。我们编写下面的代码进行测试 php学习之家

<?

php学习之家

       Say_hello();

php学习之家

?>

php学习之家http://www.444p.com

保存文件为say_hello.php

php学习之家

在php的根目录下运行 www.444p.com

./php –q say_hello.php

www.444p.com

正常情况下会显示

hello world

表示我们的第一个扩展正常的运行了!

php学习之家

  www.444p.com版权所有

解释一下上面做的操作,ext_skel生成一些框下文件,我们需要修改以下文件 php学习之家http://www.444p.com

my_module.c  扩展模块的主程序 www.444p.com php学习之家

php_my_module.h 扩展模块的头文件 www.444p.com

config.m4  配置文件 php学习之家

 

主程序中描述了php扩展模块的声明,模块中含有多少个函数,各个函数的作用,在phpinfo函数中显示什么内容,模块初始化做些什么,结束做些什么都会在这个文件里进行描述。我们在上面只是添加了一个函数say_hello,并且描述了say_hello函数的具体内容,调用zend_printf系统函数在php中打印字符串。 www.444p.com

 

本文来自 www.444p.com

在对应的头文件中声明了say_hello这个函数,从而完成了我们预期的功能。下面我们会编写一个更复杂的扩展,创造一个带参数的php扩展函数,根据给入的参数,显示hello world, xxxx。Xxxx代表输入的字符串内容,例如我的名字yorgo。

www.444p.com版权所有

  www.444p.com php学习之家

Vi my_module.c

php学习之家http://www.444p.com

修改最后的say_hello函数内容如下: www.444p.com版权所有

PHP_FUNCTION(say_hello)

{ php学习之家http://www.444p.com

        zval **yourname;

www.444p.com

  本文来自 www.444p.com

        if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &yourname) == FAILURE)

        {

php学习之家http://www.444p.com

                WRONG_PARAM_COUNT; www.444p.com php学习之家

        }

php学习之家http://www.444p.com

  www.444p.com php学习之家

        zend_printf("hello world, %s\n", Z_STRVAL_PP(yourname));

} php学习之家

存盘退出。

本文来自 www.444p.com

退回php的根目录,运行 www.444p.com版权所有

make www.444p.com版权所有

修改say_hello.php为 www.444p.com php学习之家

<?

本文来自 www.444p.com

       Say_hello(“yorgo”); 本文来自 www.444p.com

?> php学习之家

保存退出后运行 www.444p.com php学习之家

./php –q say_hello.php

得出结果 php学习之家http://www.444p.com

hello world, yorgo 本文来自 www.444p.com

表示我们这次的修改也成功了,可以改变say_hello中的参数,看看动态的效果。 php学习之家

这里主要解释上面修改的函数内容,由于say_hello函数需要有参数引入,所以在my_module.c中的say_hello函数主要在进行参数的处理,将php中引用say_hello时所填写的参数内容正确的传递到my_module.c中的say_hello处理函数中。为此,程序中添加了这么几行。

zval **yourname;

www.444p.com

if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &yourname) == FAILURE)

php学习之家

{ php学习之家

WRONG_PARAM_COUNT; www.444p.com php学习之家

}

php学习之家http://www.444p.com

zend_printf("hello world, %s\n", Z_STRVAL_PP(yourname)); www.444p.com php学习之家

  www.444p.com

代码解释如下: www.444p.com php学习之家

zval **yourname; php学习之家

初始化一个参数的指针 www.444p.com

ZEND_NUM_ARGS()

www.444p.com

得到传递过来得参数数量,并且判断如果不为1的时候表示有问题,报错。

www.444p.com版权所有

zend_get_parameters_ex(1, &yourname)

www.444p.com版权所有

将刚刚初始化的指针指向传递过来的参数,如果不成功则报错。

www.444p.com

Z_STRVAL_PP(yourname)

本文来自 www.444p.com

处理指针指向的参数并获得实际存储的值。 www.444p.com

(待续)

www.444p.com

欢迎网上转载,但请保留作者的版权声明,如需线下刊登、发表请与作者联系yorgo@163.net  http://www.ruisoft.com

php学习之家http://www.444p.com

发表评论
密码: (游客不需要密码)
记住我【Alt+S 或 Ctrl+Enter 快速提交】

搜索工具