之乎者也2011

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

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!

 

posted on 2011-09-05 05:25  之乎者也2011  阅读(364)  评论(0编辑  收藏  举报