运行环境:
我在服务器上曾经配过lamp,php版本为5.3.10,可在ubuntu上配置的php不是php源码,所以需要再下载一版源码,下载地址是 http://cn2.php.net/distributions/php-5.3.28.tar.bz2 (注:此版本虽为5.3.28,个人猜测只要大版本号不变,编译出的扩展是可以兼容的)
下载完成后安装:
tar -jxvf 源码包名称
找到安装路径下的ext文件夹,这里有很多常用的扩展源码,还有一个ext_skel的脚本程序,用来在Unix环境下生成扩展骨架
我们为新扩展命名为okok,使用ext_skel创建骨架:
./ext_skel --extname=okok
我们发现在ext文件夹下多了一个叫okok的文件夹,进入后有三个文件需要我们修改(config.m4, okok.c, php_okok.h):
1>config.m4
打开后注意这里
这是修改后的结果,修改前红框中的内容都被dnl注释掉了,注释说的很清楚,如果我们的扩展需要使用外部组件,则使用。。。否则使用。。。 所以这里选择第二种方式,把注释去掉,保存
2>okok.c
打开后找到
PHP_FE(confirm_okok_compiled, NULL)这是脚本自动生成的一个函数,后面有与之对应的函数体,这里我们可以添加多个自定义的函数,为了演示我们修改原confirm_okok_compiled为okok,然后在此文件中找到PHP_FUNCTION(comfirm_okok_compiled),修改为PHP_FUNCTION(okok) ,这里的对应关系大家应该不难明白,函数体里可以自定义方法,本文不涉及实现问题,我们不对函数体做修改(这里有编写好的测试代码),保存
3>php_okok.h
这是很容易忽略的一步,打开找到PHP_FUNCTION(comfirm_okok_compiled),修改为PHP_FUNCTION(okok),如果添加新的函数则对应添加
回到okok目录下,开始编译
1>/usr/bin/phpize
2>./configure
3>make
4>make install
这时,在 /usr/lib/php5/20090626 目录下,生成了okok.so扩展文件,引用扩展就不再赘述了
做了一个小实验,想知道当自己写的扩展函数如果与php自身或其他扩展的函数名相同时会发生什么,结果编写了一个phpinfo()的自定义函数,重启Apache失败,静态页也无法打开