有两个理由需要自己编写PHP扩展。第一个理由是:PHP需要支持一项她还未支持的技术。这通常包括包裹一些现成的C函数库,以便提供PHP接口。例如,如果一个叫FooBase的数据库已推出市场,你需要建立一个PHP扩展帮助你从PHP里调用FooBase的C函数库。这个工作可能仅由一个人完成,然后被整个PHP社区共享(如果你愿意的话)。第二个不是很普遍的理由是:你需要从性能或功能的原因考虑来编写一些商业逻辑。

1.下载php源码包:
wget http://tw1.php.net/distributions/php-7.1.9.tar.gz

  1. 解压源码包 , Zend目录里面包含了PHP的Zend Engine源代码,有些函数和宏的定义我们需要在这里面简单地看一下。
    ext目录里面包含了PHP原生的扩展,以及我们开发自己的扩展时可以利用的工具,Linux下使用ext_skel,Windows下使用ext_skel_win32.php

  2. 使用./ext_skel --help

./ext_skel --extname=module_name

就可以在ext目录下生成自己的扩展

config.m4配置文件
开发PHP扩展,在写C代码之前,要先配置一下这里。我们打开可以看到详细的注释说明,dnl是注释语法。
如果你的扩展用到了外部依赖,就配置–with-hello选项,否则配置–enable-hello选项,删除这下面3行的del注释
PHP_ARG_ENABLE(hello, whether to enable hello support,
Make sure that the comment is aligned:
[ –enable-hello Enable hello support])
PHP_ARG_WITH和PHP_ARG_ENABLE这两个宏用来配置configure选项,一个配置需要外部依赖的,另一个配置不需要外部依赖的
配置好的内容,在后面执行configure –help时可以看到。

php_hello.h头文件
类似于C语音的头文件,包含了一些自定义的结构和函数声明,在这个demo中暂时不需要改动

hello.c代码文件
真正的逻辑代码都在这个文件中,后面会详细介绍。

三、编写代码
好了,到这一步我们终于要开始写代码了,打开hello.c文件。
整个扩展的入口是zend_module_entry这个结构,具体的定义可以在Zend目录下的zend_modules.h文件中看到,一共有十几个属性,快速跳过,我们暂时只需要”hello world”。

zend_module_entry hello_module_entry = {STANDARD_MODULE_HEADER,"hello",hello_functions,PHP_MINIT(hello),PHP_MSHUTDOWN(hello),PHP_RINIT(hello),       /* Replace with NULL if there's nothing to do at request start */PHP_RSHUTDOWN(hello),   /* Replace with NULL if there's nothing to do at request end */PHP_MINFO(hello),PHP_HELLO_VERSION,STANDARD_MODULE_PROPERTIES
};

STANDARD_MODULE_HEADER帮我们实现了前面6个属性
“hello”是扩展的名字
hello_functions是扩展包含的全部方法的集合
后面5个宏分别代表5个扩展特定方法
PHP_HELLO_VERSION是扩展的版本号,定义在头文件中
STANDARD_MODULE_PROPERTIES帮我们实现了剩下的属性
暂时都不需要修改,知道这是一个入口就行。顺着这个入口,我们继续看怎么给扩展添加方法,在hello_functions[]方法数组中已经有了一个示例方法confirm_hello_compiled,我们参考它写我们的方法hello_world

const zend_function_entry hello_functions[] = {PHP_FE(confirm_hello_compiled,  NULL)       /* For testing, remove later. */PHP_FE(hello_world,  NULL)PHP_FE_END  /* Must be the last line in hello_functions[] */
};

先在扩展的方法数组中添加上hello_world,然后再定义hello_world。找到confirm_hello_compiled方法定义的地方,在它下面依葫芦画瓢,php_printf是Zend Engine中的printf方法。

PHP_FUNCTION(hello_world)
{php_printf("Hello World!\n");RETURN_TRUE;
}

最后在编写完c代码之后执行

phpize
./configure --with-php-config=/usr/local/php/bin/php-config
make && make install
sudo cp /vagrant/php-7.1.9/ext/hello/modules/hello.so /usr/local/php/lib/php/extensions/no-debug-non-zts-20160303/
sudo vim /usr/local/php/etc/php.ini  加上extension=hello.so'
#查看最终的效果
php -r 'echo hello_world();'

编写php自定义扩展相关推荐

  1. WCF自定义扩展,以实现aop!

    引用地址:https://msdn.microsoft.com/zh-cn/magazine/cc163302.aspx  使用自定义行为扩展 WCF Aaron Skonnard 代码下载位置: S ...

  2. 【PHP】php7.4自定义扩展的编写WINDOWS篇

    标签: PHP  开发语言专区  php  windows 其实我们很少会用到windows下的扩展,不过作为开发人员,在window下开发比较方便,所以我们一般的做法是架设一个phpstudy_pr ...

  3. 2022还在使用Mysql进行数据检索?ElasticSearch自定义扩展词库完成检索

    文章目录 1.为什么要自定义扩展ES词库呢? 2.如何自定义扩展词库呢? 3.Docker安装Nginx 4.在nginx中保存一个简易词库 5.修改IK分词器的配置文件,让其指向nginx保存的词库 ...

  4. Nacos自定义扩展的 Data Id 配置

    Spring Cloud Alibaba Nacos Config可支持自定义 Data Id 的配置. 一个完整的配置案例如下所示: 下边我们在service2微服务下配置扩展. spring:ap ...

  5. my97DatePicker 自定义扩展方法(实现备忘录)

    昨天在经理安排下,提出一个需求,显示出日历,并在日历上显示特殊日期,当鼠标移动至此日期时,弹出div,显示当天具体的操作信息.在网上与园子里查找一段时间,并没有准确的demo,所以无奈只有自己研究,二 ...

  6. php扩展库后门,编写基于PHP扩展库的后门

    author:lxj616 0x00 前言 今天我们将讨论编写基于PHP扩展库的后门.通常来说,大部分入侵者都会在脚本中留下自定义代码块后门.当然,这些东西很容易通过源代码的静态或动态分析找到. 利用 ...

  7. Vortex: 一种基于RISC-V指令集自定义扩展的开源GPGPU架构

    目录 1. 背景知识 1.1 RISC-V设计核心:RISC-V指令集ISA 1.1.1 精简指令集 1.1.2 模块化指令集 1.2 用户自定义指令集扩展 1.3 GPU层次结构 2. Vortex ...

  8. PIE SDK算法的自定义扩展

    1.算法功能简介 算法的自定义扩展允许用户自主开发新的算法.自定义的算法必须实现PIE.SystemAlgo.BaseSystemAlgo基础类,这样才能被PIE的算法管理器调用起来. 2.算法功能实 ...

  9. PHP7 windows增加自定义扩展和编译PHP源代码

    PHP7 windows增加自定义扩展和编译PHP源代码 需要用到的材料 ①确定需要编译的版本,查看PHPINFO,确定PHP版本,VC版本和PHP位数.根据PHP VC版本下载对应的Visual S ...

最新文章

  1. SAP PM 初级系列20 - 维修工单的检验批
  2. 基于SSM实现新闻推荐系统
  3. 关于清除浮动那些事儿~
  4. bzoj1791: [Ioi2008]Island 岛屿 单调队列优化dp
  5. C语音的预处理,编译,汇编,链接过程分析
  6. 《Java 高并发》05 线程的基本操作
  7. Java Agent的隔离实现以及卸载时一些坑
  8. SharpZipLib压缩解压
  9. TemplatePart用法说明
  10. android wear 同步应用,Android Wear发布 突出语音及同步功能
  11. python商城源码_腾讯大佬用了10小时讲完的Python,整整400集,拿走不谢
  12. 语言写贪吃蛇墙角符号_从零基础到拥抱人工智能,您的孩子可能就差一个贪吃蛇游戏...
  13. 分享100佳精美的作品集网站设计案例
  14. 软件类配置(七)【ubuntu16.04安装netbeans、opencv并配置开发环境。】
  15. Django之tag标签和filter标签
  16. IDEA连接kerberos环境的HDFS集群报错整理
  17. 显卡天梯图vs专业计算卡丽台T4,v100vs混合精度训练
  18. java文件服务,苹果相关浏览器文件名乱码而其他例如谷歌浏览器不乱码
  19. 技术领导力 程序员如何才能带团队 文摘 (一)
  20. 单链表的插入操作(全)

热门文章

  1. Linux的文件系统结构
  2. Unity手游实战:从0开始SLG——ECS战斗(四)实战ECS架构和优化
  3. 中国历史上农村剩余劳动力的安置政策
  4. 搭建gitserver并实现git push 自动部署
  5. 记一次xfs文件系统损坏,磁盘修复问题
  6. 论Sue这个人呐(=@__@=)
  7. stagefright 架构分析(六) 创建一个 Soft Decoder
  8. 详解微信支付中的异步通知
  9. MATLAB 数字图像处理---车牌简单识别【亲测有效】
  10. moment时间操作