设为首页 收藏本站
查看: 492|回复: 0

[经验分享] 用c/c++写php扩展模块的杂想

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2017-4-5 11:14:28 | 显示全部楼层 |阅读模式
  我们知道:php支持c/c++写的扩展模块。原因无他,因为php底层本质上就是c实现的,既然人家zend可以用c来实现现在php的这么多功能函数,我们当然也可以了。这一篇博文不会讨论如何去实现这样一个扩展,只是分析一下原理和优缺点以及一些杂想。
  1:为什么要写扩展呢?比如我要实现一个功能,我完全可以用php来书写封装一个函数,这样足矣。为什么要这么费劲的去用c去扩展一个模块呢?好吧,你想:我用c语言去封装一个函数,和用汇编去实现同样功能的一个函数,你觉得哪个效率高?不言而喻,c实现的函数效率必然要比php的高。 在这一点上:很多人会有一个误区,包括我自己原先也以为: 我用c/c++扩展实现了一个功能函数。在php中执行的时候不是一样也要:先编译生成opcode,然后再执行将其处理?这样一来:前一个编译的过程根本没有任何省略啊?这个效率高谈何说起? 注意了:这里所说的高效率并不是从执行流程上来说的,无论是原本的源码,还是你自己写的扩展,其都要先编译后执行,这个效率上区别不大(当然也是有区别的),真正导致效率不同的地方是:你用php来实现一个函数,是直接把这个函数体写在php中,而用c/c++来扩展一个模块的话:你在php中只需要调用一下这个函数即可! 一个是只有一句函数调用,一个是整个函数体,编译成opcode的工作量:后者是前者的n个数量级倍!更别提后边的执行过程了。所以效率的区别就在于:最开始的编译数量多少。
  当然了,还有另外一个理由就是扩展你的php功能,比如说:出现一种新的数据库,其已经放出了使用的c库,但是php还不支持,这个时候我们就可以开发一个模块来让php支持他。
  2:那写一个扩展复杂不复杂呢?php本身已经为你的扩展提供了框架,类似mfc或者qt那样,你要做的只是找到框架中对应的位置去添加代码实现你的功能,然后重新编译下php源码即可!当然了:你要实现自己的功能,是需要使用php提供的一些系统函数的。可能你会说了:我为什么不可以使用标准c的一些函数呢?当然:你完全可以使用,而且php扩展框架对大部分c标准函数都完全支持。但是对于类似malloc这种内存管理函数的使用就完全不同了。这是因为:php在内存管理上使用了内存池!如果你对内存池原理很了解的话就明白:php为什么不用malloc而使用自己封装过后的内存分配函数了。所以:最好能用php的系统函数就用系统函数,否则:一很容易出现内存泄露二php原本做的一些优化你都无法使用。
  3:杂想:知道php的c/c++扩展实现原理后,我就开始幻想:那是不是可以把qt的所有函数库当做一个模块给加载进去呢?我觉得这事完全靠谱。这样的话就很有意思了:用户可以在浏览器中请求去建一个QWidget,而后server把这个widget的信息或者解析过后的样式直接返回给用户浏览器····以前有朋友给我设想:未来可以在浏览器中打魔兽··哈哈,这个完全可以啊! 不过如此一来:客户端这种概念会越来越淡化了。而且浏览器也得支持这种qt的数据类型和格式。不过html这东西也很不错,完全可以用他取代ui库。但是如此一来:浏览器的地位就显得如此重要了,以后会不会之间简化浏览器的样式使其不再单纯是一个应用程序,而是一个server这样的概念,用户可以随处使用它呢?这样一来:云计算和云存储就真的实现了!!狂想,狂想······O(∩_∩)O~

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-360523-1-1.html 上篇帖子: php中两个网页之间的变量传送 下篇帖子: 十款PHP开发者值得关注的编码工具
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表