php是最容易掌握的一门web脚本语言。虽然简单,php的功能十分强大、扩展灵活、应用广泛。笔者最近打算将一款软件以php扩展开发的制作出来;之前一直没有做过此类开发,现在把边学边做的过程记录下来和大家一起分享。希望读后对看了本文的你也有所帮助。笔者的开发环境是centos5.10+httpd 2.2+php5.4.2。
一、php扩展开发的准备
在php扩展开发之前,这些准备工作或者说是应该掌握的基本技能有:
熟悉Linux操作。毕竟是在Linux下开发嘛。
熟悉PHP,C/C++
了解Linux下 C/C++开发调试及编译
看到这里,很多对linux了解较少的人估计开始打退堂鼓了。千万别,笔者也是linux菜鸟一枚,不会的东西大多数都是找google、百度帮忙^_^!。笔者这里有一篇文章《在centos5下编译安装php记录》,介绍了编译安装php的方法,php扩展开发的环境和编译php的环境是一样的,直接照着做就可以了。
二、快速完成php扩展开发的框架
这里,笔者不打算介绍那么多原理了,反正笔者一看到大段大段的理论和代码就觉得头疼;我们一开始就单刀直入从快速做一个扩展例子做起。首先需要做一个扩展的框架,就像我们作windows Form开发,大部分界面代码都由Visual Studio提前建好了一样。如果你仔细阅读了《在centos5下编译安装php记录》,现在对php源代码目录应该有些熟悉了,php扩展都存放在php-src/ext目录下,进入这个目录,里面有一个ext_skel的shell脚本,现在我们要是它来制作php扩展的框架。
$cd php-src/ext/
$ ./ext_skel –extname=cnphp
//执行完上面的指令会出现如下信息
Creating directory cnphp
Creating basic files: config.m4 config.w32 .svnignore cnphp.c php_cnphp.h CREDITS EXPERIMENTAL tests/001.phpt cnphp.php [done].
To use your new extension, you will have to execute the following steps:
1. $ cd ..
2. $ vi ext/cnphp/config.m4
3. $ ./buildconf
4. $ ./configure –[with|enable]-cnphp
5. $ make
6. $ ./sapi/cli/php -f ext/cnphp/cnphp.php
7. $ vi ext/cnphp/cnphp.c
8. $ make
Repeat steps 3-6 until you are satisfied with ext/cnphp/config.m4 and
step 6 confirms that your module is compiled into PHP. Then, start writing
code and repeat the last two steps as often as necessary.
php扩展开发的框架已经完成了,很简单吧,我们新建了一个名叫”cnphp”的扩展模块,可以使用–enable-cnphp将这个扩展静态编译到php中,当然,一般我们不推荐这么做,自己的扩展模块,灵活性第一。
三、编译php扩展
框架做好后,不能直接运行,需要修改config.m4中的如下几行:
- 原文
+ 修改后
=============================================
-dnl PHP_ARG_ENABLE(cnphp, whether to enable cnphp support,
-dnl Make sure that the comment is aligned:
-dnl [ --enable-cnphp Enable cnphp support])
-dnl PHP_SUBST(CNPHP_SHARED_LIBADD)
-
-PHP_NEW_EXTENSION(cnphp, cnphp.c, $ext_shared)
-fi
============================================
+ PHP_ARG_ENABLE(cnphp, whether to enable cnphp support,
dnl Make sure that the comment is aligned:
+ [ --enable-cnphp Enable cnphp support])
+ PHP_SUBST(CNPHP_SHARED_LIBADD)
+
+PHP_NEW_EXTENSION(cnphp, cnphp.c, $ext_shared)
+fi
上面PHP_ARG_ENABLE函数有三个参数,第一个参数是我们的扩展名(注意不用加引号),第二个参数是当我们运行./configure脚本时显示的内容,最后一个参数则是我们在调用./configure –help时显示的帮助信息。
如果我们显示运行./configure –enable-cnphp,那么终端环境便会自动将$PHP_CNPHP变量设置为yes,而PHP_SUBST函数只不过是php官方对autoconf里的AC_SUBST函数的一层封装。 最后重要的一点是,PHP_NEW_EXTENSION函数声明了这个扩展的名称、需要的源文件名、此扩展的编译形式。如果我们的扩展使用了多个文件,便可以将这多个文件名罗列在函数的参数里,如:
PHP_NEW_EXTENSION(sample, sample.c sample2.c sample3.c, $ext_shared)
最后的$ext_shared参数用来声明这个扩展不是一个静态模块,而是在php运行时动态加载的。完成修改后,我们就可以编译php扩展了。
//进入刚才新建的扩展文件夹cnphp
$ cd cnphp
$ phpize
$ ./configure
$ make
$ make test
一切顺利的话,php模块开发已经完成^_^。当然,这只是一个空模块,下篇文章,笔者将继续介绍如何编写自己的php函数,一起边学习边制作吧。
PS:还记得php有两种运行方式TS(Thread Safe)和NTS(Non Thread Safe),php扩展在编译的过程中也需要用到,如果php是TS版本的,php扩展则必须是TS版本的,这个必须一直,否则会编译报错。默认编译的是TS版本,如果需要NTS则需要修改php-src/main/php_config.h的定义:
#define ZTS 1 //如果是NTS(Non Thread Safe)修改为 #define NTS 1