需要开发扩展的场景:
1)应用非常注重效率,如复杂的图像算法,需要编写成扩展模块
2)有些系统调用不能用PHP直接访问,比如Linux下的fork函数创建一个进程,需要编写扩展
3)需要商业化一个应用,又不想暴露源码
一,搭建PHP框架
1 先了解下PHP的源目录吧
ext:存放动态和内建模块的目录,在这里可以找到所有的官方扩展,以后也会在这里放新的扩展
main:包含PHP的主要的宏定义
pear:PHP的扩展与应用库目录,包含pear的核心文件
sapi:包含不同服务器抽象层的代码
TSRM:zned和php的线程安全资源管理器目录
zend:包含zend引擎的所有文件,可以找到所有Zend API的定义
除了上边的文件目录,一般还会包括下边几个文件进来:
main/php.h : 位于main目录下,包含绝大部分的PHP宏以及PHP API的定义
Zend/zend.h : 位于Zend目录下包含绝大部分的zend宏和Zend API的定义
Zend/zend_API.h : 位于zend目录下,包含Zend API的定义
2 ext_skel工具:
在ext的源码目录下,有ext_skel和ext_skel_win32.h两个自动化构建扩展开发的框架工具,前者在Linux下使用,后者在win下使用
win下扩展开发的介绍:
1)使用ext_skel工具编写扩展
a) cd到PHP源码目录的ext目录下,输入以下命令扩展框架:
php ext_skel_win32.php --extname = myext (如果提示php不是内部或者外部命令,也不是可运行的程序或批处理文件,请先安装PHP,并且添加php到环境变量中)
b)安装成功之后会发现ext目录下多了一个myext目录,myext目录中,myext.dsp是VC++的工程文件
c)编译安装扩展
用VC++打开myext.dsp工程文件,按编译按钮开始编译这个扩展,在编译的过程中,会发现编译出错提示:link fatal error:can'tfind input files "php5ts.lib",从PHP的安装目录下(注意不是php的源码目录,是安装目录)的dev目录中把php5ts.lib复制到创建的扩展目录(myext)目录下,再次按编译按钮,这次可以成功编译
d)编译成之后源代码的根目录会多出一个Release_TS目录,在该目录中有刚刚编译好的动态扩展文件 php_myext.dll,如果找不到Release_TS目录,而找到了debug_TS目录,请把VC++的编译模式改成release模式
到此已经编译出了一个PHP扩展文件,只要把编译出的php_myext.dll放到安装目录的ext目录下,在php.ini中添加extension = php_myext.dll 并重启web服务器就可以了,安装完成之后就可以像其它扩展一样在phpinfo里看到扩展信息了,可以调用一下扩展封装的函数来确认是否安装成功
Linux下扩展开发的介绍(以ubutun系统为例):
a)安装php-dev包
使用php-dev包中的phpize工具可以减少很多繁琐的步骤,如果用php源码编译的话,就可以不用安装php-dev包,源码中已经饱和phpize工具,在ubutun下安装dev包的命令是 sudo spt-get install php5-dev安装完成后,可以使用以下命令查看是否安装成功 phpize --version,如果显示phpize的版本信息就证明安装成功
b)使用ext_skel工具,在php的源码目录下有个ext_Skel文件,用法与win下的ext_skel_win32.h类似
eg:创建一个php扩展
./ext_skel --extname=myext 然后,可以看到一系列的提示步骤
c)编译安装扩展
在生成扩展之后,进入到扩展目录,使用phpize命令生成扩展的配置工具,然后编译和安装:
cd myext
phpize
./configure --with-php-config = /usr/local/php5/bin/php-config
make
maketest
make install
编译完成后可以在 /usr/local/php5/lib/php/extensions/no_debug_non_.../下看到生成的扩展文件myext.so
然后在phpini文件中添加扩展信息 extension = myext.so
d)使用 php -m | grep myext 查看扩展是否安装成功