很长时间没有认真的写篇文章,从今天开始正式学习PHP扩展开发,之前在Linux上也折腾过,只是认为在Linux上没有熟悉的C++ IDE,看PHP底层源码不方便,是转向Windows上部署环境,配合VS2010,源码查看、智能提示方便多了。PHP扩展开发是基于C语言,自己对C/C++比较熟悉,从扩展开发这个方向了解PHP Zend虚拟机底层实现应该是一条比较好的途径。本文主要介绍在Linux、Windows环境如何部署PHP扩展开发环境,以及我遇到的一些问题。
1、Linux平台环境配置
Linux平台配置过程很容易,本节以centos 4.3为例
- step1:下载PHP源码包,并解压
- step2:使用ext_skel生成工程框架
./ext_skel --extname=myext
(1)在.h文件中声明导出函数:
PHP_FUNCTION(sqlapm);
(2)在.c文件中实现导出函数
PHP_FUNCTION(sqlapm)
{
php_printf("sqlapm....");
}
- step3:编译生成.so文件
修改config.m4文件将10、11、12三行最前面的dnl删除掉
phpize
./configure --with-php-config=..../php/bin/php-config
make
make test
然后在工程下面module目录下生myext.so文件,拷贝至lib/php/extensions/no-debug-non-zts-20121212目录下,修改php.ini文件,php -m
验证模块是否加载。
2、Windows平台环境配置
Linux平台配置方式非常容易,但在Linux下查看php源码,开发效率效率较低,Windows下面VS IDE非常强大,智能提示都很方便。许多教程介绍VC++6.0的配置过程,但是VC++6.0平台不支持64位编译,而且win7以上兼容性不好,本节介绍的是VS2010配置过程。
- step1:使用ext_skel生成工程框架
php ext_skel_win32.php --extname=myext
如果生成出错,请检查下面两点:
(1)事先要安装cygwin,并且修改ext_skel_win32.php中的$cygwin_path路径;
(2)源码目录名不能包含空格;
- step2:打开myext.dsp工程文件、编译工程
(1)这时提示main/config.win32.h文件缺少,新建config.win32.h文件,添加下面两行:
#define SIZEOF_LONG 4
#define PHP_COMPILER_ID "VC11"
第二行的VC11版本不是根据VS2010的VC10版本,而是要与windows二进制包中的php5ts.lib编译使用的VC版本一致,下面会讲php5ts.lib。
(2)再次编译,提示缺少php5ts_debug.lib
php5ts.lib来自同版本php二进制包dev/目录下php5ts.lib文件,php5ts_debug.lib对应php debug包dev下的php5ts_debug.lib文件。
(3)再次编译,可能会提示“无法解析的外部符号”
这种错误在C++中很常见,一般都是.lib库没有正确包含了,你会发现前面已经包含了php5ts.lib文件,这里出错的原因就是php5ts.lib是64位lib包,将VS2010编译方式改成x64即可顺利编译。因此不建议使用VC++6.0,直到VS2005微软才支持x64编译方式。
- step3:编译dll生成在TS_Release或TS_Debug目录下
Windows下配置环境事项:
- 建议安装Visual Assist X插件,智能智能提示非常强大;
- 注意php binary包的VC编译器版本及编译位数(32/64);
- VS的编译方式也要与php binary包编译方式保持一致(Release/Debug);
- 列表项目config.win32.h需要改成binary VC编译器版本;
后记:
我自己经历的学习PHP的过程是PHP基础学习、然后结合PHP框架(如Yii、CI等)做项目。 自己也用PHP做过几个项目,PHP语法层面已经比较熟悉,Ci框架用的比较多。框架更多的体现的是设计模式,统一开发规范、避免重复造轮子,没有项目的结合,单纯的看框架教程没什么意义。众所周知,PHP开发效率高,项目庞大了之后性能倒成了瓶颈,各种优化方法也很多。使用PHP扩展是解决性能瓶颈非常有效的方法,除此之外在扩展中引入多线程、epoll模型、Opencv都非常方便。虽然扩展开发非常有用,PHP开发入门比较容易,估计大部分PHP程序员都没有使用过,还是停留在框架使用层面,扩展开发更接近Zend虚拟机底层实现,使用C语言开发,对C/C++没有一定的工程调试经验,对操作系统及数据结构没有一定的理解学习起来确实很困难。后续文章会陆续介绍PHP生命周期、内核变量、HashTable实现、内存管理、ZendAPI及实际扩展开发DEMO。