PHP扩展浅谈
by Ren Xin Qiang
这篇文章主要讲述php扩展开发,给想要尝试php扩展开发的同胞一个入口.需要一定的C语言及ZEND引擎了解
环境
- Mac OS 10.13.2
- 源码php7.1.1
- php环境php7.1.18
- gcc 4.9
- g++ 4.9
- ./configure –with=php-config = /usr/local/Cellar/php@7.1/7.1.18_1/bin/php-config
为什么要写PHP扩展?
- 第一个理由是:PHP需要支持一项她还未支持的技术。这通常包括包裹一些现成的C函数库,以便提供PHP接口。例如,如果一个叫FooBase的数据库已推出市场,你需要建立一个PHP扩展帮助你从PHP里调用FooBase的C函数库。这个工作可能仅由一个人完成,然后被整个PHP社区共享(如果你愿意的话)。
- 第二个不是很普遍的理由是:你需要从性能或功能的原因考虑来编写一些商业逻辑。
怎么开发PHP扩展?
这个问题我在开始的时候一直摸不到头脑,边学习C语言边看PHP源码,虽然看不太懂,也是去网上查资料,硬着头皮看,在看zend引擎的时候很迷茫,因为网上没有很好的zend API函数文档可看,只能猜.更不要说扩展了
现在好了,鸟哥给出了如何用C/C++开发php扩展http://www.laruence.com/2009/04/28/719.html 原来官方直接给出了扩展搭建骨架供我们使用
查看https://renxinqiang.github.io/recursion/2018/09/10/php-config.html 了解源码及扩展源码
使用官方提供的扩展骨架开发
先上原理
这个是鸟哥博客的扩展原理图,使用文件来创建扩展骨架.
下面是--extname
创建扩展骨架
- 下载php源码(和自己php环境一致版本)
- 进到源码 ext/文件里
./ext_skel --extname=lovephp
cd lovephp
- 修改config.m4文件,将PHP_ARG_WITH往下两行前面的dnl去掉
phpize
检测环境./configure --with-php-config=自己php环境的php-config
配置处理make && make install
编译这个扩展- 找到当前php环境ini添加.so文件,lovephp.so文件在module中 extension=lovephp.so
- 测试
php -d enable_dl=On myfile.php
或者php -m | grep lovephp
- 修改lovephp.c文件 添加
PHP_FUNCTION(helloWorld) { php_printf("Hello World!\n"); RETURN_TRUE; }
-
找到函数zend_module_entry 在里面添加 PHP_FE(helloWorld, NULL)
-
重新编译
./configure && make && make install
- 输出
php -r "helloWorld();"
扩展骨架介绍
- PHP_MINIT_FUNCTION php加载时加载一次,初始化资源或常量,可常住内存,随时调用
- PHP_RINIT_FUNCTION 请求时加载,初始化php变量等!(可多个)
- PHP_RSHUTDOWN_FUNCTION 进行GC操作,各种释放内存,注销变量等等操作
- PHP_MSHUTDOWN_FUNCTION 进行模块销毁,此次进程内该模块销毁,再做一次进程内申请的内存回收,此次不回收则会导致内存泄漏
- PHP_MINFO_FUNCTION 提供给phpinfo查看扩展信息使用
再上个扩展骨架运行流程图
多线程 多进程
总结
到此我们的扩展已经很简单很简单的完成了,只限制于理解动态PHP扩展的运行原理,我们需要继续学习C语言来加强Zend引擎的理解.ZEND线程安全,内存回收,都是以后 开发商业逻辑业务必备基础.需恶补C语言和ZEND引擎
鸟哥心得http://www.laruence.com/2009/04/28/719.html
彩蛋:php扩展还是有使用C++框架开发,PHP-CPP框架可以直接编译扩展到环境中,可以了解下 官网http://www.php-cpp.com/
Subscribe via RSS