用C编纂你自己的php扩展

php中文网
发布: 2016-06-13 12:12:46
原创
1228人浏览过

用C编写你自己的php扩展

本文链接:http://blog.csdn.net/ddjohn/article/details/42317675

本文参考:http://blog.csdn.net/taft/article/details/596291

如果你没写过php扩展,又是追求性能的极客,那么这篇文章肯定适合你:

假如你有这样一个php程序

易想商城系统.net
易想商城系统.net

基于Asp.Net+C#+Access的网上商店系统,具有智能化、高扩展、稳定、安全等特性,并拥有超强功能,可自由添加频道,后台智能修改风格,只要懂得网站常识的站长就可以轻松利用易想商城建立起专业的大型网上书店,点卡店、鲜花店、手机店、服装店、团购网等不同类型商城。易想商城有CMS增加频道功能,能够容易的把商城系统扩展成资讯网站多风格自由切换,全站经过专业的优化处理,让你的网站在百度上轻易的就能找

易想商城系统.net 0
查看详情 易想商城系统.net

立即学习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的方式来加载,我用最快最简明的方式说明。

立即学习PHP免费学习笔记(深入)”;

1.首先你需要有php的源码目录 cd到其ext目录下执行:

立即学习PHP免费学习笔记(深入)”;

./ext_skel --extname=luckyext --proto=luckyext.def
登录后复制

这条命令会自动生成一个名叫luckyext的目录 里面有基本的扩展骨架文件,核心的文件只有三个 congif.m4用来做编译配置,luckyext.h定义都文件包括声明你的自定义函数,还有luckyext.c用来写C的函数源码,其他都是附加的骨架文件,暂时可以不用管。

立即学习PHP免费学习笔记(深入)”;

2.在luckyext.c内编写你要的函数,记得在头文件内声明,不然编译的时候会报错

立即学习PHP免费学习笔记(深入)”;

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的环境配置就不说了

立即学习PHP免费学习笔记(深入)”;

立即学习PHP免费学习笔记(深入)”;

phpize./configuremake&&make install
登录后复制

立即学习PHP免费学习笔记(深入)”;

成功编译的话会在你的php指定的扩展目录中生成一个luckyext.so的文件

4.引入扩展重新加载php

立即学习PHP免费学习笔记(深入)”;

vi /etc/php.iniextension=luckyext.so
登录后复制
我是mac机,修改的时候请看自己机器的配置,修改完后保存重启fpm
killall php-fpmphp-fpm
登录后复制

5.测试

立即学习PHP免费学习笔记(深入)”;

终端输入

立即学习PHP免费学习笔记(深入)”;

php -m
登录后复制
出来的扩展中应该有luckyext了,至于它支持什么函数 可以用ext/luckyext目录内的luckyext.php脚本去运行看看 正常情况会输出它支持的函数self_concat_c()

立即学习PHP免费学习笔记(深入)”;

6.性能对比 直接运行C写的php

立即学习PHP免费学习笔记(深入)”;

<?phpself_concat_c('fire',10000000);
登录后复制

出来的结果耗时是惊人的,0.06秒,相差10倍!为什么呢,因为如果用php那套代码,每次往字符串塞字符的时候,php都需要做一个内存的动态分配,循环越多次,性能开销就越大,而C写的function直接就计算出最终需要分配多少内存了,所以快就快在这里,是不是很有趣~哈哈,至少我觉得很刺激!

立即学习PHP免费学习笔记(深入)”;

本文的C例子属参考前辈翻译的文件,以后要多修修C的功底才行了,后面我会研究更多C的知识,加油!

相关标签:
php
PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号