为什么要用C扩展
C是静态编译的,执行效率比PHP代码高很多。同样的运算代码,使用C来开发,性能会比PHP要提升数百倍。IO操作如CURL,因为耗时主要在IOWait上,C扩展没有明显优势。
另外C扩展是在进程启动时加载的,PHP代码只能操作Request生命周期的数据,C扩展可操作的范围更广。
准备工作:
- lnmp环境
- 对应的php版本源码(https://www.php.net/downloads.php)
第一步
在/usr/local/ 下面建立一个空白目录 PhpSourceCode 存放php源码
第二步
进入源码目录 cd /usr/local/PhpSourceCode/php-5.6.40/ext/
执行命令:./ext_skel --extname=myext 出现下面则表示成功
cd myext 可以看到php_myext.h、myext.c、config.m4等几个文件。config.m4是AutoConf工具的配置文件,用来修改各种编译选项。
第三步:修改config.m4
修改为:
第四步:
修改php_myext.h文件: 添加以下两行代码 (del 为注释)
- PHP_FUNCTION(confirm_myext_compiled);
-
PHP_FUNCTION(myext_helloworld);
第五步
修改myext.c文件 这的代码是将函数指针注册到Zend引擎,
在myext.c 末尾加上
PHP_FUNCTION(myext_helloworld)
{
char *arg = NULL;
int arg_len, len;
char *strg;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &arg, &arg_len) == FAILURE) {
return;
}
php_printf("Hello World!\n");
//RETRUN_TRUE;
}
zend_parse_parameters是用来接受PHP传入的参数,RETURN_XXX是用来返回给PHP数据。
第六步:开始编译啦 在myext目录下依次执行:
- /usr/local/php/bin/phpize
- ./configure --with-php-config=/usr/local/php/bin/php-config
- make
- make test
- 然后修改php.ini加入extension=myext.so 重启服务应用
ok 完成编写....