标签:
本文链接:http://blog.csdn.net/ddjohn/article/details/42317675
本文参考:http://blog.csdn.net/taft/article/details/596291
如果你没写过php扩展,又是追求性能的极客,那么这篇文章肯定适合你:
假如你有这样一个php程序
function self_concat($string, $n){
$result = "";
for($i = 0; $i < $n; $i++){
$result .= $string;
}
return $result;
}
$str = self_concat('fire',10);1.首先你需要有php的源码目录 cd到其ext目录下执行:
./ext_skel --extname=luckyext --proto=luckyext.def
2.在luckyext.c内编写你要的函数,记得在头文件内声明,不然编译的时候会报错
PHP_FUNCTION(self_concat_c)
{
char *str = NULL;
int argc = ZEND_NUM_ARGS();
int str_len;
long n;
char *result; /* Points to resulting string */
char *ptr; /* Points at the next location we want to copy to */
int result_length; /* Length of resulting string */
if (zend_parse_parameters(argc TSRMLS_CC, "sl", &str, &str_len, &n) == FAILURE)
return;
/* Calculate length of result */
result_length = (str_len * n);
/* Allocate memory for result */
result = (char *) emalloc(result_length + 1);
/* Point at the beginning of the result */
ptr = result;
while (n--) {
/* Copy str to the result */
memcpy(ptr, str, str_len);
/* Increment ptr to point at the next position we want to write to */
ptr += str_len;
}
/* Null terminate the result. Always null-terminate your strings
even if they are binary strings */
*ptr = '\0';
/* Return result to the scripting engine without duplicating it*/
RETURN_STRINGL(result, result_length, 0);
} phpize ./configure make&&make install
成功编译的话会在你的php指定的扩展目录中生成一个luckyext.so的文件
4.引入扩展重新加载php
vi /etc/php.ini extension=luckyext.so我是mac机,修改的时候请看自己机器的配置,修改完后保存重启fpm
killall php-fpm php-fpm
终端输入
php -m出来的扩展中应该有luckyext了,至于它支持什么函数 可以用ext/luckyext目录内的luckyext.php脚本去运行看看 正常情况会输出它支持的函数self_concat_c()
6.性能对比 直接运行C写的php
<?php
self_concat_c('fire',10000000);本文的C例子属参考前辈翻译的文件,以后要多修修C的功底才行了,后面我会研究更多C的知识,加油!
标签:
原文地址:http://blog.csdn.net/ddjohn/article/details/42317675