一直想写PHP扩展开发教程,真正要写的时候不知道从何下手,也总感觉理解不到位。先入门下手,以后再分享调用C开发的.so动态库。不得不说PHP的成功原因之一有大量可以使用的扩展。
为什么使用扩展
1、开发未支持的技术。比如想让PHP支持新的技术或者数据库等。
2、应用非常注重效率。
实践
需求:调用hello_world() 函数 返回 Hello World! 入门教程,先使用静态编译。
php中实现非常简单,就不在此累赘了。
一、生成扩展代码
在UNIX下一个叫ext_skel的脚本被用于建立扩展的骨架,骨架信息从一个描述扩展接口的定义文件中取得。
执行如下代码:
#./ext_skel --extname=hello_world
生成代码框架如下:
二、修改配置文件
修改config.m4文件。如下所示
PHP_ARG_ENABLE(hello_world, whether to enable hello_world support, dnl Make sure that the comment is aligned: [ --enable-hello_world Enable hello_world support])
如下图所示:
PHP_ARG_ENABLE和PHP_ARG_WITH区别:其实两者并没有什么本质的不同,只不过enable多代表不依赖外部库便可以直接编译,而with大多需要依赖于第三方的lib。
三、修改源码文件
修改hello_world.c文件
找到PHP_FUNCTION(confirm_hello_world_compiled) 修改为PHP_FUNCTION(hello_world)
该函数中具体代码如下所示:
PHP_FUNCTION(hello_world) { char *str; str = estrdup("Hello World!"); RETURN_STRING(str, 0); }
修改php_hello_world.h文件
找到PHP_FUNCTION(confirm_hello_world_compiled) 修改为PHP_FUNCTION(hello_world)
四、编译扩展
找到php已经安装程序的phpize文件。
#/usr/local/php/bin/phpize #./configure --with-php-config=/usr/local/php/bin/php-config #make #make install
phpize帮助我们根据config.m4文件生成一个configure脚本、Makefile等文件。
以上的php路径请修改为自己的文件位置。最终在php的扩展目录module生成目标文件 hello_world.so。
五、添加扩展
修改php.ini文件,添加hello_world.so 扩展。
php文件中执行如下代码:
echo hello_world();
显示结果为:Hello World!
畅想
php扩展看似很酷,但是实际生产中很难使用。原因如下:
1、需要C基础,难学。
2、需要团队进行维护,如果只是一个人进行维护的话,对于后续维护的人压力山大。这方面人才少。
3、目前小流量根本使用不到。如果到需要用扩展优化性能的地步时候,说明网站的访问量相当可观的。一些企业转向了Java。放弃PHP。
4、PHP不适合做密集型计算。
这次就分享点简单的入门教程。下次分享一个小的案例。
你他妈就是个智障儿童。
你他妈就是个智障儿童。
你他妈就是个智障儿童。