聂庆鹏
摘要:PHP是当前应用十分广泛的Web编程语言。虽然PHP为开发者提供了大量扩展函数,但在很多特殊应用场合,仍需要自定义开发扩展函数库。当前从操作层面完整介绍PHP扩展函数开发技术的资料还十分匮乏。本文以Windows平台为例,详细探究了在VS2008环境下开发PHP5.4.X版本的扩展函数(动态链接库)的实现思路和步骤,并通过实践进行了谏言。
关键词:PHP;动态链接库;扩展
中图分类号:TP311.1 文献标识码:A 文章编号:1007-9416(2017)04-0207-01
1 引言
PHP(Personal Homepage:HyperText Preprocessor)是一种应用十分广泛的Web编程语言。该语言的一个重要特点是提供了大量扩展函数,帮助开发者完成常用操作。在Windows平台上,这些函数是以若干个DLL(Dynamic Link Library,动态链接库)方式提供的。但这些函数仍不能完全满足开发者的个性化需求。在很多特殊应用场合下,需要自行开发动态链接库,对PHP进行功能扩展。但由于PHP的版本众多,源代码体系十分复杂,官方的技术支持资料又比较缺乏,让很多开发者望而却步。本文以Windows平台为例,对PHP动态链接库开发的一般过程和相关技术进行了详细研究,给出了详细步骤和具体操作方法,并通过实践进行了验证。
2 开发思路与过程
PHP属于开放源代码软件,其源代码可以在官方网站下载得到。PHP的源代码使用C语言编写,需要使用編译工具进行编译和调试。因此,需要下载PHP的源代码文件,使用PHP官方提供的PHP扩展开发模板创建程序“骨架”,使用相应版本的C语言开发环境进行编译和调试,最终编译出所需要的DLL文件。必须指出的是,PHP的版本和编译器有直接关系。本文以PHP5.4版本为例,需要搭配Visual Studio 2008(VC9)环境进行调试和编译。
2.1 开发环境搭建
基本的PHP动态链接库开发环境包括:(1)Visual Studio 2008;(2)PHP5.4.X Windows平台二进制包。使用IIS作为调试软件时,需使用PHP的线程安全(ThreadSafe,TS)版本,如果使用APACHE作为调试软件,需使用非线程安全(Non-ThreadSafe,NTS)版本;(3)PHP5.4.45源代码包;(4)PHP SDK开发包;(5)与PHP SDK版本对应的deps包;(6)MSys1.0小型GUN环境工具[1]。
2.2 重新编译PHP
从官方网站获取的PHP源代码和SDK中缺少开发动态链接库所必须的config.win32.h,需要通过对PHP进行重新编译来生成。其步骤如下:
(1)创建自定义目录C:\php_studio\作为工作目录,以下用%dir%表示本目录;(2)解压PHP SDK至 %dir%php_sdk,使用命令行窗口运行VS2008安装路径下的vcvarsall.bat批处理文件。运行后会输出运行成功的提示。(3)进入%dir%php_sdk\bin目录,分别运行批处理文件“phpsdk_setvars.bat”和“phpsdk_buildtree.bat php54dev”,在bin目录下产生php54dev文件夹。(4)将deps包解压到 %dir%\php-sdk\php54dev\vc9\x86\目录,覆盖掉该目录下原有的deps目录;解压PHP源代码包到%dir%\php_stdio\php-sdk\php54dev\vc9\x86\,文件夹名为php5445,本文件夹即PHP源代码的根目录。(5)使用命令行进入PHP源代码根目录,运行“buildconf”命令。(6)运行“configure --disable-all --enable-cli”命令,以最小化方式编译PHP。命令执行后,有一系列输出,结尾部分显示“Type nmake to build PHP”。打开源代码文件夹的main子文件夹,发现自动创建了config.win32.h,这说明PHP编译成功。
2.3 创建新扩展框架
PHP为开发者提供了动态链接库文件的框架,运行ext_skel_ win32.php可以自动创建,为后面的编写代码提供基础[2]。其步骤如下:
(1)命令行下进入PHP源代码目录下的ext文件夹,其中有ext_skel_win32.php文件,该文件即Windows下创建扩展骨架的工具。执行“php ext_skel_win32.php --extname=myFunc”命令,其中,myFunc为自定义的扩展名称。运行后得到一系列屏幕输出(略)。(2)打开%dir%\php-sdk\php54dev\vc9\x86\php5445\ext可以看到一个新建的myFunc文件夹,其中包含若干文件,如myFunc.dsp等,这就是新扩展的框架文件,可以直接用VS2008打开进行编辑。
2.4 在VS2008中编译扩展
扩展框架创建完毕后,需要使用VS2008编辑、编译项目文件。项目文件默认为调试项目,需要进行参数配置。步骤如下:
(1)将项目“活动解决方案配置”由Debug_TS修改为Release_TS。(2)将“设置运行库”设为“多线程 DLL(/MD)”。(3)将“编译”设置为“编译为C代码(/TC)”。(4)将“输出文件”设置为“Release_TS/php_myFunc.dll”。(5)在“附加库目录”中增加“%dir% \php5.4.45\dev”。
进行完上述配置后,执行编译命令,在ext\myFunc目录下会生成php_myFunc.dll,说明一个空白的动态链接库编译完毕。
2.5 编写自定义函数
上一步得到的动态链接库仅作为调试环境测试对象,并没有包含用户自定义函数代码。要在其中编写自定义函数来完成特殊操作,可以按照以下步骤进行。
(1)用VS2008打开myFunc.h,在默认函数PHP_FUNCTION(confirm_myFunc_compiled);下面,定义自己的函数名:PHP_FUNCTION(myfunc_test);(2)打开myFunc.c源代码,在PHP_FE(comfirm_myFunc_compiled, NULL)下面,添加自己的函数:PHP_FE(myfunc_test , MULL)(3)在myFunc.c中末尾处继续添加
PHP_FUNCTION(myfunc_test){ //函数体 }
函数体编写完成后,编译生成DLL动态链接库,将生成的php_myFunc.dll文件载入到PHP扩展之中,则在PHP程序中可以直接通过以下方式调用自定义扩展函数。
<?php echo myfunc_test(); ?>
3 结语
本文综合各方面研究资料,详细梳理了Windows平台下搭建PHP扩展开发环境和进行动态链接库开发的流程和步骤,尤其对其中的关键环节进行了剖析,对于PHP扩展开发人员具有很好的参考价值。由于PHP源代码体系十分庞大,本文并未对自定义函数的实现部分进行过多分析,如要进行复杂的扩展开发,需要对PHP内核进行更加深入分析和探究。
参考文献
[1]Windows中搭建PHP扩展开发环境[Z].2012-10-25.
[2]PHP扩展开发及内核应用[Z].2015-10-22.