用C编写你自己的php扩展
来源:互联网 发布:怎么进入淘宝网开店 编辑:程序博客网 时间:2024/04/26 15:08
本文链接: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);
如果传入的第二个参数N很大,程序的性能如何?我在自己的机器上测试下如果 n=10000000的时候耗时0.6s左右 如果用C写这个php function然后php直接调用,会快么?那就开始写这样一个简单的扩展吧,采用静态编译成.so的方式来加载,我用最快最简明的方式说明。
1.首先你需要有php的源码目录 cd到其ext目录下执行:
./ext_skel --extname=luckyext --proto=luckyext.def
这条命令会自动生成一个名叫luckyext的目录 里面有基本的扩展骨架文件,核心的文件只有三个 congif.m4用来做编译配置,luckyext.h定义都文件包括声明你的自定义函数,还有luckyext.c用来写C的函数源码,其他都是附加的骨架文件,暂时可以不用管。
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); }
3.编译扩展 关于php的环境配置就不说了
phpize./configuremake&&make install
成功编译的话会在你的php指定的扩展目录中生成一个luckyext.so的文件
4.引入扩展重新加载php
vi /etc/php.iniextension=luckyext.so我是mac机,修改的时候请看自己机器的配置,修改完后保存重启fpm
killall php-fpmphp-fpm
5.测试
终端输入
php -m出来的扩展中应该有luckyext了,至于它支持什么函数 可以用ext/luckyext目录内的luckyext.php脚本去运行看看 正常情况会输出它支持的函数self_concat_c()
6.性能对比 直接运行C写的php
<?phpself_concat_c('fire',10000000);
出来的结果耗时是惊人的,0.06秒,相差10倍!为什么呢,因为如果用php那套代码,每次往字符串塞字符的时候,php都需要做一个内存的动态分配,循环越多次,性能开销就越大,而C写的function直接就计算出最终需要分配多少内存了,所以快就快在这里,是不是很有趣~哈哈,至少我觉得很刺激!
本文的C例子属参考前辈翻译的文件,以后要多修修C的功底才行了,后面我会研究更多C的知识,加油!
0 0
- 用C编写你自己的php扩展
- 编写PHP的C扩展
- 编写自己的php扩展函数(c)
- 如何编写一个PHP的C扩展
- 如何编写一个PHP的C扩展
- Linux环境用C编写PHP扩展
- 使用C语言编写PHP 5.5.4的扩展函数
- c/c++编写protobuf 对应的php扩展
- 如何用C语言编写PHP扩展的详解
- 用你自己的插件扩展jQuery
- ubuntu 13.04 用c快速编写一个php扩展
- 编写php扩展的问题
- c编写php扩展简单示例
- 为PHP编写C/C++扩展
- 用C扩展php
- 编写你自己的单点登陆
- 编写你自己的Mutex类
- 编写你自己的jquery插件
- 泛型、模板
- 元旦快乐,阖家团圆,幸福安康.C#重载示例(有问重载该如何选择?在C#中可很方便地在智能感知弹出中选择不同参数列表进行使用;不像C/C++那样,要记住编译器自动选择最佳匹配参数列表的概念)
- mysql 如何设置自动增长序列 sequence(二) 在实际中调用
- 常用的json数据解析格式
- init/initwithcoder/initwithframe
- 用C编写你自己的php扩展
- linux常用脚本
- 2.SqlCommand操作sql2012
- MFC对象的创建顺序
- A/B测试与灰度发布
- 泛型笔记
- 位于XDB的服务器127.0.0.1要求用户名和密码
- 万用表怎么测电阻?
- 正月十五放灯笼,小时候用酒盒,罐头瓶,萤火虫自制的灯笼