学习PHP的同学都会经历一个这样的过程,从学习手册到实践、再到深入学习源码,以及ZendEngine的运行原理、内核实现。所以必然会接触PHP扩展的开发,甚至是自己尝试开发一些扩展来提升自己的应用的性能。写PHP扩展需要一定的C/C++的基础知识,如果比较欠缺可以去先行了解。
在PHP7的诞生以后,PHP的性能是足够的。很多时候我们遇到的性能瓶颈都是出在I/O或者业务逻辑上,而不是PHP本身的执行速度不够。而像计算密集的程序,比如一些算法,我们不会拿PHP去做。
那什么时候我们需要写PHP扩展呢?
-
当PHP的语法特性无法满足我们的要求时。比如在PHP5.5之前,没有Generator,所以如果我们想要在PHP中使用协程,就必须在底层实现一个上下文切换的库。
-
当我们需要使用一个C/C++的库时。只有当你充分阅读并理解它的源码以后你才有可能用PHP重写这个库,而直接封装成PHP扩展你只往往需要理解它暴露的接口就可以了。简单高效。
-
当PHP的执行速度真的成为我们项目的性能瓶颈时。yaf和swoole等扩展的存在证明了这一点。
最重要的一点,掌握PHP扩展开发的技术,可以给PHP带来无限的可能,而不是局限于Web开发的小领域中。
./ext_skel --extname=hope
首先介绍一下这个扩展的目录结构:
config.m4是作为编译文件,在执行phpize 时会通过config.m4中的内容生成一系统编译配置文件,如configure.
我们先打开config.m4文件,找到如下图所示的行:
我们删除注释dnl,然后进入hope.c,找到如下函数,PHP_FUNCTION(hello),并修改为如下:
好了,我们的逻辑写完了。
编译成PHP扩展 *.so
只剩下编译的活了
-
# /usr/bin/phpize
-
# ./configure --with-php-config=/usr/bin/php-config
-
# make
拷贝到PHP扩展目录,重启PHP服务
-
# cp modules/helloc.so /usr/lib64/php/modules/
-
# vim /etc/php.ini // 为php配置文件加上扩展(文件末尾就行)
-
extension=helloc.so
-
# service php-fpm restart // 这里你用的apache那么就需要重启 apache
调用自己的PHP扩展,最后写个test.php验证自己的扩展:
-
# vim test.php
-
<?php echo hello(1022); ?>
-
# php test.php
-
# Congratulations! You have successfully modified ext/hope/config.m4. Module hope is now compiled into PHP.
这就是第一个PHP扩展,大致上了解了创建一个PHP扩展的过程,当然如果要实现更多的功能,还需要了解很多PHP底层基础数据结构API的调用,我们会在后续的文章中不断更新,欢迎留言一起探讨。
欢迎扫码,关注我的微信公众号