编写自己的php扩展函数
编写自己的php扩展函数编写自己的php扩展函数Yorgo Sun 2002/01/22php程序写的时间长了自然对他所提供的功能了如指掌他所提供的一大堆功能真是觉得很好用但有时候会发现php也缺少一些功能自己总是会产生为php添加一些自定义的功能的想法。久而久之终于今天憋不住了开始动手研究如何添加。下载一个php的源代码包这里使用的是php 4.0.5版解压后会看到php的根目录下会有README.EXT/_SKEL这样一个文件打开详细阅读了一下发现了一个非常好用的工具这个工具可以帮你构建一个空的php扩展然后你向里面添加相应的代码就可以完成你自己的功能扩展了。下面我们就来介绍如何使用这个工具。首先转移你的目录到php的目录下的ext目录如果你只需要一个基本的扩展框架的话执行下面的命令./ext/_skel --extnamemodule/_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 --extnamemy/_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文件文件内容大致如下dnlI d IdIddnl 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/_shared)Fi根据你自己的选择将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/_compiled);一行前面添加下面的代码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));}存盘退出。退回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/_ARGS()得到传递过来得参数数量并且判断如果不为1的时候表示有问题报错。zend/_get/_parameters/_ex(1, yourname)将刚刚初始化的指针指向传递过来的参数如果不成功则报错。Z/_STRVAL/_PP(yourname)处理指针指向的参数并获得实际存储的值。(待续)欢迎网上转载但请保留作者的版权声明如需线下刊登、发表请与作者联系yorgo163.net http://www.ruisoft.com《网络安全从零到精通全套学习大礼包》96节从入门到精通的全套视频教程免费领取如果你也想通过学网络安全技术去帮助就业和转行我可以把我自己亲自录制的96节 从零基础到精通的视频教程以及配套学习资料无偿分享给你。网络安全学习路线图想要学习 网络安全作为新手一定要先按照路线图学习方向不对努力白费。对于从来没有接触过网络安全的同学我帮大家准备了从零基础到精通学习成长路线图以及学习规划。可以说是最科学最系统的学习路线大家跟着这个路线图学习准没错。配套实战项目/源码所有视频教程所涉及的实战项目和项目源码学习电子书籍学习网络安全必看的书籍和文章的PDF市面上网络安全书籍确实太多了这些是我精选出来的面试真题/经验以上资料如何领取