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!