一直想写PHP扩展,但总是被搁置,现在博客建好了,就把编写PHP扩展的环境记录下来,免得总是停留来环境搭建这一步。本文是根据Rango-韩天峰的视频教程记录的:http://www.tudou.com/programs/view/Tp2HpLU9Ncg/


1.准备一个Ubuntu系统

安装基本工具:apt-get install gcc make autoconf

下载PHP源码:http://cn2.php.net/downloads.php#v5.6.3


2.解压PHP源码,进入源码的ext目录下,可以看到一个名为ext_skel的文件,它是一个命令,能帮助我们构建一个工程框架,直接执行(./ext_skel)命令,可以看到它的一些帮助信息

我们用ext_skel来创建一个测试工程框架:

./ext_skel --extname=chenxiong #chenxiong就是扩展的名字

执行成功后,便在ext目录下新建了一个名为chenxiong的文件夹,进入chenxiong目录后,可以看到一些文件:

config.m4 是iautoconf的编译配置文件

php_chenxiong.h是扩展的头文件

php_chenxiong.c是扩展的C源文件


3.接着,我们要修改config.m4文件,以此启用扩展。

修改10到12行

dnl PHP_ARG_WITH(chenxiong, for chenxiong support,
dnl Make sure that the comment is aligned:
dnl [  --with-chenxiong             Include chenxiong support])

改成

PHP_ARG_WITH(chenxiong, for chenxiong support,
[  --with-chenxiong             Include chenxiong support])

然后,我们在chenxiong目录下执行下面命令

phpize

执行完毕后,可以发现chenxiong目录下又生成了一些文件,

我们主要看configure,他是一个shell脚本,可以帮助我们检测一些头文件,环境特性等。

然后我们执行这个脚本

 ./configure

执行成功后,chenxiong目录下又产生了一些文件

其中有一个Makefile文件,他是make的配置配置文件,我们继续执行make编译

./make

到这里为止,我们已经生成了一个框架,虽然我们一句代码也没写。

因为它在生成时,就自带了一个test函数,在chenxiong.h和chenxiong.c这两个文件里

PHP_FUNCTION(confirm_chenxiong_compiled)
{
	char *arg = NULL;
	int arg_len, len;
	char *strg;

	if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &arg, &arg_len) == FAILURE) {
		return;
	}

	len = spprintf(&strg, 0, "Congratulations! You have successfully modified ext/%.78s/
	    config.m4. Module %.78s is now compiled into PHP.", "chenxiong", arg);
	RETURN_STRINGL(strg, len, 0);
}

上面的代码就是chenxiong.c里自带的测试 函数。


4.现在我们来安装他们,直接在当前目录执行以下命令将其安装到PHP扩展目录里

sudo make install

编译安装成功后,可以看到下面类似信息

Installing shared extensions: /usr/lib/php5/20121212/

这后面的路径就是扩展安装的地方,然后修改php.ini启用扩展

这里我们可以通过下面的命令来找到php.ini的位置

php -i|grep php.ini

直接在php.ini里增加一行

extension=chenxiong.so

保存后,我们执行以下命令,列出php所有启用的模块

php -m

我们可以在列表中看到chenxiong模块的名字


5.测试

这时我们写一个测试文件,就叫test.php,里面写入:

<?php
echo confirm_chenxiong_compiled("Hello");
?>

执行:

php test.php

可以看到结果

Congratulations! You have successfully modified ext/chenxiong/config.m4. Module Hello is now compiled into PHP.


6.现在我们来修改一下这个自带扩展,如下,就两个地方

PHP_FUNCTION(hello_chenxiong)
{
	int a;
	int b;
	char *c;
	int c_len;
	if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "lls", &a, &b,&c,&c_len) == FAILURE) {
		return;
	}
	char *str;
	int len = spprintf(&str, 0, "%s%d\n", c, a*b);
	RETURN_STRINGL(str, len, 0);

}

const zend_function_entry chenxiong_functions[] = {
	PHP_FE(hello_chenxiong,	NULL)	
	PHP_FE_END
};

修改之后,我们直接执行下面命令重新编译

sudo make install

这里我们可以执行下面命令,来测试扩展函数是否存在

php --rf "hello_chenxiong"

写个测试文件

<?php
echo hello_chenxiong(123,345,"123*345=");
?>


要在网页上运行,只要在服务器对应的php.ini里启用扩展就行了。