1.前言

随着lamp/lnmp架构的流行,Php语言越来越得到广泛的使用。php语言在表现层有着非常优异的表现,部署方便,开发迅速。但Php语言也有着天生短板以及局限性—-对多线程以及多进程的支持不甚如意,以及相对于静态语言缓慢的执行速度。如今网站的数据越来越多,涉及到的密集型计算对性能的要求越来越高,php语言越来越难以满足这种计算性能的要求,由于Php底层由c语言开发完成,用c语言更改php底层以及为Php语言编写底层拓展是解决Php本身性能的一大方法。

本文将以一个简单实例来演示如何为Php编写底层拓展,读者掌握此方法后,可以根据具体的业务需求,为php编写具有良好性能的底层拓展。如,笔者在工作中遇到过随时计算用户之间GPS距离的产品需求,涉及的计算量巨大。读者遇到此类的需求,可以考虑在底层专门写出c语言拓展来解决问题。本文成稿时间匆忙,纰漏之处在所难免,希望读者指正。

2.编写拓展

2.1 自动生成框架

请下载php源码包,yum安装的php没有ext_skel这个文件。ext_skel这个文件就用来帮我们生成框架。具体的目录如下:

[root@localhost~/tools/php-5.5.38/ext]> ll /root/tools/php-5.5.38/ext/ext_skel

-rwxr-xr-x. 1 1000 admins 8192 Jul 20 16:41 /root/tools/php-5.5.38/ext/ext_skel

现在执行这个文件,生成一个helloWorld的框架:

[root@localhost~/tools/php-5.5.38/ext]> /root/tools/php-5.5.38/ext/ext_skel --extname=helloWorld

Creating directory helloWorld

Creating basic files: config.m4 config.w32 .svnignore helloWorld.c php_helloWorld.h CREDITS EXPERIMENTAL tests/001.phpt helloWorld.php [done].

To use your new extension, you will have to execute the following steps:

1.  $ cd ..

2.  $ vi ext/helloWorld/config.m4

3.  $ ./buildconf

4.  $ ./configure --[with|enable]-helloWorld

5.  $ make

6.  $ ./sapi/cli/php -f ext/helloWorld/helloWorld.php

7.  $ vi ext/helloWorld/helloWorld.c

8.  $ make

Repeat steps 3-6 until you are satisfied with ext/helloWorld/config.m4 and

step 6 confirms that your module is compiled into PHP. Then, start writing

code and repeat the last two steps as often as necessary.

如上所示,ext_skel帮我们生成了helloWorld拓展的框架,里面包含了一个配置文件config.m4, c语言的头文件php_helloWorld.h, 以及函数文件helloWorld.c(这个文件就是写入c函数体的地方)。找到这些文件:

[root@localhost~/tools/php-5.5.38/ext/helloWorld]> ll

total 32

-rw-r--r--. 1 root chuji001 2178 Oct 30 02:54 config.m4

-rw-r--r--. 1 root chuji001  324 Oct 30 02:54 config.w32

-rw-r--r--. 1 root chuji001   10 Oct 30 02:54 CREDITS

-rw-r--r--. 1 root chuji001    0 Oct 30 02:54 EXPERIMENTAL

-rw-r--r--. 1 root chuji001 5296 Oct 30 02:54 helloWorld.c

-rw-r--r--. 1 root chuji001  514 Oct 30 02:54 helloWorld.php

-rw-r--r--. 1 root chuji001 2962 Oct 30 02:54 php_helloWorld.h

drwxr-xr-x. 2 root chuji001 4096 Oct 30 02:54 tests

2.2 编辑文件

编辑config.m4这个配置文件,找到如下配置行,去掉前面的dnl, 目的是方便之后configure编译新开发出来的模块:

10 dnl PHP_ARG_WITH(helloWorld, for helloWorld support,

11 dnl Make sure that the comment is aligned:

12 dnl [  --with-helloWorld             Include helloWorld support])

改为:

10 PHP_ARG_WITH(helloWorld, for helloWorld support,

11 Make sure that the comment is aligned:

12 [  --with-helloWorld             Include helloWorld support])

接下来编写c的头文件,找到这一行:

PHP_FUNCTION(confirm_helloWorld_compiled);      /* For testing, remove later. */

这一行是我们实际调用的函数名称,读者可以改成方便开发团队调用的名称,也可以不更改,这里笔者更改如下:

PHP_FUNCTION(helloWorld);       /* For testing, remove later. */

接下来更改编译文件helloWorld.c函数文件:

41 const zend_function_entry helloWorld_functions[] = {

42         PHP_FE(confirm_helloWorld_compiled,     NULL)           /* For testing, remove late

r. */

43         PHP_FE_END      /* Must be the last line in helloWorld_functions[] */

44 };

改为注册好的函数名:

41 const zend_function_entry helloWorld_functions[] = {

42         PHP_FE(helloWorld,     NULL)           /* For testing, remove late

r. */

43         PHP_FE_END      /* Must be the last line in helloWorld_functions[] */

44 };

接下来就是编写自己的业务逻辑函数,笔者这里写入一个简单的helloWorld,读者可根据自己的需求来编写调用的函数:

154 PHP_FUNCTION(helloWorld)

155 {

156     zend_printf("hello world\n");

157 }

2.2 编译生成拓展

编译php:

[root@localhost~/tools/php-5.5.38/ext/helloWorld]> /application/php5.5.34/bin/phpize

Configuring for:

PHP Api Version:         20121113

Zend Module Api No:      20121212

Zend Extension Api No:   220121212

生成拓展:

这个时候观察目录,多了一个configure编译文件

[root@localhost~/tools/php-5.5.38/ext/helloWorld]> ll

total 1244

-rw-r--r--. 1 root chuji001  79850 Oct 30 03:39 acinclude.m4

-rw-r--r--. 1 root chuji001 310225 Oct 30 03:39 aclocal.m4

drwxr-xr-x. 2 root chuji001   4096 Oct 30 03:39 autom4te.cache

drwxr-xr-x. 2 root chuji001   4096 Oct 30 03:39 build

-rwxr-xr-x. 1 root chuji001  45079 Oct 30 03:39 config.guess

-rw-r--r--. 1 root chuji001   1542 Oct 30 03:39 config.h.in

-rw-r--r--. 1 root chuji001   2166 Oct 30 03:09 config.m4

-rwxr-xr-x. 1 root chuji001  35782 Oct 30 03:39 config.sub

-rwxr-xr-x. 1 root chuji001 447850 Oct 30 03:39 configure

执行configure编译,生成拓展, configure完成之后执行make(必要):

[root@localhost~/tools/php-5.5.38/ext/helloWorld]> ./configure --with-php-config=/application/php5.5.34/bin/php-config

查看array_square_sum目录的module目录,会发现里面生成helloWorld.so,这个就是我们需要的扩展。

[root@localhost~/tools/php-5.5.38/ext/helloWorld/modules]> ll

total 28

-rw-r--r--. 1 root chuji001   823 Oct 30 03:46 helloWorld.la

-rwxr-xr-x. 1 root chuji001 23351 Oct 30 03:46 helloWorld.so

编写php.ini的配置文件,为Php加入拓展:

899 extension=helloWorld.so

将生成的拓展文件复制放入php默认的拓展文件目录当中去:

[root@localhost~/tools/php-5.5.38/ext/helloWorld/modules]> cp helloWorld.so /application/php5.5.34/lib/php/extensions/no-debug-zts-20121212/

重启httpd服务器,这个时候通过phpinfo你就可以看到自己编写的拓展啦!如图:

编写Php脚本即可直接调用这个函数:

1 <?php

2    helloWorld();

3 ?>

显示如图:

结语

用c来为Php编写拓展是一个深入的课题,笔者这里只是给出了简单的例子,如读者有需要,需找更加详细的资料,本文的目的仅为入门。

原创文章,作者:21期王逸凡,如若转载,请注明出处:http://www.178linux.com/55578

基于c扩展框架php,深入Php底层,用c为php编写拓展相关推荐

  1. java编写一个框架_手把手教你写一个基于 RxJava 的扩展框架

    背景 现在 RxJava 在 Android 开发中可谓时炽手可热,其受欢迎程度不言而喻,也因此在 github 上出现了一系列的基于 RxJava 的框架,如 RxBinding.RxPermiss ...

  2. php-人员权限管理源码,基于ThinkPHP5+ACE框架开发的响应式通用后台权限管理系统PHP源码|响应式轻量级企业网站管理系统...

    源码介绍 基于ThinkPHP5+ACE框架开发的响应式通用后台权限管理系统PHP源码是一款响应式轻量级企业网站管理系统,采用ThinkPHP5.0.10+国外ACE1.40的UI模板的后台内容管理框 ...

  3. 熹乐科技范维肖CC:基于开源 YoMo 框架构建“全球同服”的 Realtime Metaverse Application

    前言 在「RTE2022 实时互联网大会」中,熹乐科技创始人 & CEO @范维肖CC 以<基于开源 YoMo 框架构建"全球同服"的 Realtime Metave ...

  4. 基于ACE Proactor框架下高并发、大容量吞吐程序设计既最近的一个产品开发总结

    Reactor与 Proactor 基本概念 在高性能的I/O设计中,有两个比较著名的模式Reactor和Proactor模式,其中Reactor模式用于同步I/O,而Proactor运用于异步I/O ...

  5. 基于 Egg.js 框架的 Node.js 服务构建之用户管理设计

    转载需经本人同意且标注本文原始地址:https://zhaomenghuan.github.io/blog/nodejs-eggjs-usersytem.html 前言 近来公司需要构建一套 EMM( ...

  6. Asp.net 面向接口可扩展框架之类型转化基础服务

    新框架正在逐步完善,可喜可贺的是基础服务部分初具模样了,给大家分享一下 由于基础服务涉及面太广,也没开发完,这篇只介绍其中的类型转化部分,命名为类型转化基础服务,其实就是基础服务模块的类型转化子模块 ...

  7. windows phone7 学习笔记14——地理位置服务与反应性扩展框架

    使用Location Service能帮助开发者为windows Phone 开发具备位置感知(Location-Aware)功能的应用程序.比如很多导航的软件,查找附近吃饭.娱乐甚至厕所的应用程序, ...

  8. php异业联盟平台源码,基于ThinkPHP5.1框架开发的B2C在线商城系统PHP源码

    会员优惠 会员优惠 月费会员8折.年费会员5折.永久会员2折 源码介绍 基于ThinkPHP5.1框架开发的B2C在线商城系统PHP源码,支持WAP手机端+微信小程序+支付宝小程序+多种支付方式! 这 ...

  9. 生存分析——快手的基于深度学习框架的集成⽣存分析软件KwaiSurvival(一)

    看到快手这篇文章,还开源了他们的KwaiSurvival,上手试了试: KwaiSurvival 是快⼿DA⾃主开发的基于深度学习框架的集成⽣存分析软件,帮助使⽤者在 Python编程环境下⾼效地使⽤ ...

最新文章

  1. 【转】iOS开发学习计划
  2. DOS命令行数据乱码解决
  3. 如何在EXCEL中添加下拉框
  4. C# 中 NPOI 库读写 Excel 文件的方法【摘】
  5. CubeMX配置串口的程序烧入板子不跑的解决方法
  6. SAP License:SAP 清帐介绍
  7. Activity返回值
  8. 虚拟化--062 vsphere workstation bios启动
  9. 软件工程Java毕设 SSM药品管理系统(含源码+论文)
  10. matlab实现振动弹簧的实时动画,Matlab实现振动弹簧的实时动画
  11. Aircrack-ng套件_无线网卡破解
  12. 数值分析实验(四)之方程求根的数值方法
  13. oracle hugepage设置,Linux系统下快速配置HugePages的完整步骤
  14. 《青春无烦恼》基督之灵爱
  15. 上海波涛装饰集团有限公司乐山分公司
  16. java不属于约束,【单选题】在Java中,以下哪个约束符可以用来定义成员常量()。 A. static B. finally C. abstract D. final...
  17. png格式图片 转 icns格式图标
  18. 背包问题_(DP经典),一,(01背包,填满背包)
  19. 项目管理之-项目评估
  20. [转]UDP(udp通信、广播、组播),本地套接字

热门文章

  1. 二维数组malloc申请空间以及初始化方式
  2. 混乱是怎样炼成的——《C解毒》试读
  3. 绝命毒师观后感(r6笔记第48天)
  4. 测序 测序过程和原理
  5. 计算机二级 公共基础知识资料
  6. 照片怎么添加相框?分享你和好用的方法
  7. 树模型(一):预备知识
  8. 对java导出PDF进行图片,(图片/文字)水印,页眉页脚的添加
  9. 详版大数据报告_如何制作大数据报告
  10. Linux 卸载程序