编写自己的php扩展函数

编辑自身的php扩充函数php程序写的年华长了,自然对她所提供的效劳一览无遗,他所提供的一大堆效果,真是认为很好用,但神跡会发觉php也贫乏一些意义,本身接二连三会爆发为php增多一些自定义的效益的主见。经过了相当长的时间,终于后日憋不住了,发轫入手商讨什么增添。下载叁个php的源代码包,这里运用的是php
4.0.5版,解压后会看到php的根目录下会有README.EXT_SKEL那样一个文件,展开详细阅读了须臾间,开掘了一个老大好用的工具,这么些工具得以帮您构建叁个空的php扩展,然后你向里面增多相应的代码就足以变成你和谐的法力扩大了。下面大家就来介绍怎样使用那些工具。首先转移你的目录到php的目录下的ext目录,借使您只须求一个基本的增加框架的话,试行下边包车型客车授命:./ext_skel
–extname=module_namemodule_name是您本身能够筛选的增加模块的名字,比如笔者选择的my_module。实行工具后会自动在ext目录下成立你选拔的module_name名字的目录,里面早就更改了有关的代码,那些代码中只要求调节config.m4文件中的三行注释就足以健康的编写翻译带那么些自定义增添模块的php了。在php的根目录试行下列操作就足以获取。./buildconf./configure
–enable-module_namemake上边作者来演示创设my_module扩充框架的全经过,为了更有效应,大家来成功叁个php的扩唐淼能,在php中调用这一个效应能够在web页面中彰显hello
world那一个卓绝单词。在php目录下的ext目录中,实践上面包车型地铁命令./ext_skel
–extname=my_module取得反映结果:Creating directory my_moduleCreating
basic files: config.m4 Makefile.in .cvsignore my_module.c
php_my_module.h tests/001.phpt my_module.php [done].To use your new
extension, you will have to execute the following steps:1.$ cd ..2.$ vi
ext/my_module/config.m43.$ ./buildconf4.$ ./configure
–[with|enable]-my_module5.$ make6.$ ./php -f
ext/my_module/my_module.php7.$ vi ext/my_module/my_module.c8.$
makeRepeat steps 3-6 until you are satisfied with
ext/my_module/config.m4 andstep 6 confirms that your module is compiled
into PHP. Then, start writingcode and repeat the last two steps as often
as
necessary.要是你能看懂上边包车型地铁事物,那就照着去做。假诺不是太知道的话,依据作者上面包车型大巴唤醒来做也能够。Cd
my_module首先走入my_module目录vi
config.m4使用文本编辑器张开config.m4文件,文件内容大约如下:dnl $Id$dnl
config.m4 for extension my_modulednl don’t forget to call
PHP_EXTENSION(my_module)dnl Comments in this file start with the
string ‘dnl’.dnl Remove where necessary. This file will not workdnl
without editing.dnl If your extension references something external, use
with:dnl PHP_ARG_WITH(my_module, for my_module support,dnl Make sure
that the comment is aligned:dnl [–with-my_module Include my_module
support])dnl Otherwise use enable:dnl PHP_ARG_ENABLE(my_module,
whether to enable my_module support,dnl Make sure that the comment is
aligned:dnl [–enable-my_module Enable my_module support])if test
“$PHP_MY_MODULE” != “no”; thendnl If you will not be testing anything
external, like existence ofdnl headers, libraries or functions in them,
just uncomment thednl following line and you are ready to go.dnl Write
more examples of tests here…PHP_EXTENSION(my_module,
$ext_sharedState of QatarFi依照你和谐的取舍将dnl PHP_ARG_WITH(my_module, for
my_module support,dnl Make sure that the comment is aligned:dnl
[–with-my_module Include my_module
support])修改成PHP_ARG_WITH(my_module, for my_module support,Make
sure that the comment is aligned:[–with-my_module Include my_module
support])或者将dnl PHP_ARG_ENABLE(my_module, whether to enable
my_module support,dnl Make sure that the comment is aligned:dnl
[–enable-my_module Enable my_module
support])修改成PHP_ARG_ENABLE(my_module, whether to enable
my_module support,Make sure that the comment is
aligned:[–enable-my_module Enable my_module
support]卡塔尔平时笔者会选择前者,然后保留退出。假设您对vi文本编辑器的操作有困难的话,请参见相应的辨证作品,这里就不再详细描述了。Vi
my_module.c将文件之中的下列代码进行退换/* Every user visible function
must have an entry in my_module_functions[].*/function_entry
my_module_functions[] = { PHP_FE(say_hello, NULL)/*
加多着一行代码 */ PHP_FE(confirm_my_module_compiled, NULL) /* For
testing, remove later. */ {NULL, NULL, NULL} /* Must be the last line
in my_module_functions[]
*/};在文件的末段增多下列代码PHP_FUNCTION(say_hello){
zend_printf(“hello world/n”卡塔尔;}保存文件退出vi
php_my_module.h在文件中PHP_FUNCTION(confirm_my_module_compiledState of Qatar;一行前面增添上边包车型大巴代码PHP_FUNCTION(say_hello卡塔尔(قطر‎;保存文件退出退回到php的根目录下,试行下边包车型大巴命令./buildconf./configure
–enable-my_modulemake若是一切顺利的话,我们未来早就将扩展模块my_module编写翻译到php里面了。大家编辑下边包车型地铁代码实行测量检验?
Say_hello(卡塔尔国;?保存文件为say_hello.php在php的根目录下运维./php q
say_hello.php寻常状态下博览会示hello
world表示我们的第二个扩张常常的运维了!解释一下上边做的操作,ext_skel生成一些框下文件,大家须要修正以下文件my_module.c扩张模块的主程序php_my_module.h
扩张模块的头文件config.m4配置文件主程序中描述了php扩张模块的宣示,模块中含有几个函数,各样函数的功效,在phpinfo函数中体现怎么内容,模块开首化做些什么,截止做些什么都会在此个文件里开展描述。大家在地方只是加多了贰个函数say_hello,並且描述了say_hello函数的具体内容,调用zend_printf系统函数在php中打字与印刷字符串。在对应的头文件中评释了say_hello那几个函数,进而成就了我们预料的效用。下边我们会编写三个更复杂的扩展,创造三个带参数的php扩张函数,依照给入的参数,呈现hello
world, xxxx。Xxxx代表输入的字符串内容,譬如笔者的名字yorgo。Vi
my_module.c改正最终的say_hello函数内容如下:PHP_FUNCTION(say_hello){
zval **yourname; if (ZEND_NUM_ARGS() != 1
zend_get_parameters_ex(1, &yourname) == FAILURE) {
WRONG_PARAM_COUNT; } zend_printf(“hello world, %s/n”,
Z_STRVAL_PP(yourname卡塔尔(قطر‎State of Qatar;}存盘退出。退回php的根目录,运营make纠正say_hello.php为?
Say_hello(“yorgo”卡塔尔国;?保存退出后运转./php q say_hello.php得出结果hello
world,
yorgo代表大家这一次的改正也不负义务了,能够改换say_hello中的参数,看看动态的意义。这里关键表达上面订正的函数内容,由于say_hello函数供给有参数引进,所以在my_module.c中的say_hello函数重要在举办参数的管理,将php中援用say_hello时所填写的参数内容科学的传递到my_module.c中的say_hello管理函数中。为此,程序中增加了那样几行。zval
**yourname;if (ZEND_NUM_ARGS() != 1 zend_get_parameters_ex(1,
&yourname) == FAILURE){WRONG_PARAM_COUNT;}zend_printf(“hello world,
%s/n”, Z_STRVAL_PP(yourname卡塔尔(قطر‎);代码解释如下:zval
**yourname;初叶化多个参数的指针ZEND_NUM_ARubiconGS(卡塔尔获得传递过来得参数数量,并且推断要是不为1的时候表示有标题,报错。zend_get_parameters_ex(1,
&yournameState of Qatar将刚刚最初化的指针指向传递过来的参数,假如不成事则报错。Z_STRVAL_PP(yourname卡塔尔管理指针指向的参数并赢得实际存款和储蓄的值。(待续卡塔尔(قطر‎

1.第一是要安装好PHP

 

2.步入PHP的下载解压目录下的ext目录

#cd /root/php-5.3.6/ext

#./ext_skel –extname=hmc

 

说明:

./ext_skel –extname=module_name
module_name是你协和可以选择的恢宏模块的名字,比如小编接收的hmc。实践工具后会自动在ext目录下构建你选拔的module_name名字的目录,里面已经变化了连带的代码,那些代码中只需求调节config.m4文件中的三行注释就能够平常的编译带那一个自定义扩张模块的php了。

 

3.修改config.m4

可以将转移的module目录复制到大肆希望放置的位置

进入hmc目录

vi config.m4

应用文本编辑器打开config.m4文件

依照你和睦的筛选将

dnl PHP_ARG_WITH(hmc, for hmc support,

dnl Make sure that the comment is aligned:

dnl [ –with-hmc Include hmc support])

修改成

PHP_ARG_WITH(hmc for hmc support,

Make sure that the comment is aligned:

[ –with-hmc Include hmc support])

或者将

dnl PHP_ARG_ENABLE(hmc, whether to enable hmc support,

dnl Make sure that the comment is aligned:

dnl [ –enable-hmc Enable hmc support])

修改成

PHP_ARG_ENABLE(hmc, whether to enable hmc support,

Make sure that the comment is aligned:

[ –enable-hmc Enable hmc support])

诚如笔者会选取后者,然后保留退出。

 

4.纠正.c和.h文件代码

Vi hmc.c

将文件之中的下列代码举办修改

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

*/

const zend_function_entry hmc_functions[] = {

PHP_FE(say_hello, NULL) /* 增多着一溜儿代码 */

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

{NULL, NULL, NULL} /* Must be the last line in hmc_functions[] */

};

在文书的结尾增多下列代码

PHP_FUNCTION(say_hello)

{

zend_printf(“hello worldn”);

}

保存文件退出

vi php_hmc.h

在文件中PHP_FUNCTION(confirm_hmc_compiled卡塔尔(قطر‎;一行前边加多上边包车型客车代码

PHP_FUNCTION(say_hello);

封存文件退出

5.编写翻译安装

#phpize
#./configure –enable-hmc

#make

#make install

有道是在php的modules目录下有三个hmc.so文件,差异的机器地方会不肖似

图片 1

6.修改PHP配置

编写php.ini,把扩大参加进来:
在[PHP]模块下扩充:
extension = hmc.so
重启Httpd

#service httpd restart

 

7.php调用

创立二个c.php文件在对应的www目录下

<?
say_hello();
?>

那会儿浏览器应该出口:

hello world

 

8.调试

能够在指令行下输入

#php –q c.php

内需步向当前的www目录下

翻开是不是安装好模块能够用phpinfo(State of Qatar

图片 2

 也可以适用php -m命令

先用

#which php

找到php所在目录,不一样机器目录不相符

#/usr/bin/php -m

图片 3

 

9.带参数的函数

Vi hmc.c

修正最终的say_hello函数内容如下:

PHP_FUNCTION(say_hello)
{
zval **yourname;
if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &yourname) ==
FAILURE)

{
WRONG_PARAM_COUNT;
}
zend_printf(“hello world, %sn”, Z_STRVAL_PP(yourname));
}

修改c.php为

<?
say_hello(“清清月儿”卡塔尔;
?>

====================================

 

能够参谋以下:

一本书《Extending and Embedding
PHP
》:

 

版权证明:本文为博主原创文章,未经博主允许不得转发。


发表评论

电子邮件地址不会被公开。 必填项已用*标注