给PHP编写扩展

PHP是一种脚本语言,好处是编程效率高,支持产品的快速迭代。但是与传统的编译语言相比,CPU和内存使用效率 不好。现在Ajax技术的广泛采用,加上SNS对动态要求较高,这些缺点更显得突出。常见的办法是直接用C/C++编写一个PHP扩展,重写应用中比较复 杂的部分。这样,PHP就转变为一种胶水语言,连接起PHP和C/C++应用。

开发时,用PHP来实现业务逻辑,是不需要考虑资源管理和内存的,Zend会替你完成。但,如果用C来编写PHP的扩展,那么就要自己考虑这些事 情,必须自己管理资源的分配,使用,释放,开发和维护的成本均会上升。因为更新扩展,需要修改源码,重新编译,然后重新load扩展进PHP,然后重启 Apache…..很麻烦

下面是个打印hello wolrd的PHP扩展编写过程。PHP版本:5.2.12
1.进入安装目录,用PHP自带的扩展工具 ext_skel, 它会生成一个PHP扩展所必须的最基本架构

cd /home/changyou/php-5.2.12/ext/

./ext_skel  --extname = testmodule

2.上面这两行命令是生成了一个名称为 testmodule 的扩展。随后进入testmodule目录

cd testmodule

 

#在目录下有不少文件,testmodule.c 和 config.m4 是最重要的

testmodule.c             #是我们扩展的主要文件

config.m4                    #m4是一个宏解释工具,用来生成我们扩展的makefile

CREDITES                    #这个文件没什么太大的作用,只是用来在发布你的扩展的时候附加一些其他信息

EXPERIMENTAL           #这个文件只是标志说,这个扩展是实验性的,所以可以不用管它

testmodule.php        #这个文件是用来简单测试你的扩展的

php_testmodule.h    #这个是我们扩展的头文件

tests/001.phpt           #这个也是个测试文件,不过使用的是单元测试,阶段测试

3.修改配置文件config.m4,去掉前面的dnl (dnl在m4里是注释的意思)

vi config.m4

 

# 修改后如下:

# PHP_ARG_WITH(testmodule, for testmodule support,

# Make sure that the comment is aligned:

# --with-testmodule             Include testmodule support])

 

# 这里的with是说明,要启用这个模块,依赖于某些其他模块

# 比如:模块example,如果依赖apxs的话,就需要:

# /configure --with-apxs=/usr/local/apache/bin/apxs  --enable-example

4.我们在模块里定义一个函数,函数名 speaktome, 因此需要先在 php_testmodule.h 头文件里面声明此函数

vi php_testmodule.h

在 PHP_FUNCTION(confirm_testmodule_compiled); 下面加一句:PHP_FUNCTION(speaktome);
声明完之后,就编写 speaktome 函数

vi testmodule.c

把下面的内容加到文件最底部,这就是 speaktome 函数的逻辑

PHP_FUNCTION(speaktome)

{

	char *str = NULL;

	str = "Hello World";

	if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &str) == FAILURE) {

		return;

	}

	RETURN_STRING(str, 0);

}

5.继续编辑 testmodule.c 告诉zend引擎这个testmodule的模块有些什么函数
找到:zend_function_entry testmodule_functions[]这一行,注释的意思是:所有可用的函数必须要在这里面定义。
修改为:

zend_function_entry testmodule_functions[] = {

        PHP_FE(confirm_testmodule_compiled, NULL)  

        PHP_FE(speaktome,NULL)     # 定义函数speaktome的入口 

		{NULL, NULL, NULL}     

};

6.搞定了,最后就是编译,安装

/usr/local/web/php/bin/phpize

cd  /home/changyou/php-5.2.12/ext/testmodule

./configure  --with-php-config = /usr/local/web/php/bin/php-config

make

cp modules/yzmf.so  /usr/local/web/php/lib/php/extensions/

然后修改php.ini,让testmodule.so启用,最后重启Web服务

7. 测试
编写PHP脚本,var_dump(speaktome());
返回字符串的 hello wolrd 。
Done!

 

你可能感兴趣的:(PHP)