一、提前准备

下载并安装VS2008

下载PHP5.4.5程序:

NTS下载

TS下载

其中php二进制包分为VC6、VC8、VC9及TS和NTS版本。

VC6、VC8、VC9分别对应VC6、VC2005、VC2008

TS表示(Thread Safe),当以ISAPI(IIS SERVER)允许时,因为是单进程中执行多线程,为避免内存泄漏和共享变量安全,建议使用TS版本。

当以FAST_CGI等以单一进程来执行,这样就无需进行线程的安全检查。


下载PHP5.4.5源码

下载PHP-SDK

下载MSYS,它包括Windows下linux编译器的实现

下载deps


下面的配置基础,以f:\php_stdio文件夹为基础


二、编译PHP

首先下载php-sdk,先下载较新的php-sdk-binary-tools-20110915.zip,解压到

f:\php_stdio\php-sdk

目录下。注意,解压后,这个目录下应该有bin和script子目录。

开一个cmd窗口,切换到f:\php_stdio\php-sdk目录下,运行vcvarsall.bat来设置好编译环境变量。

VS2008安装路径\VC\vcvarsall.bat

这里vcvarsall.bat的具体目录要根据你自己的安装位置而定。

接着,进入在cmd窗口里继续运行以下命令:

bin\phpsdk_setvars.bat
bin\phpsdk_buildtree.bat php54dev

这样,在f:\php_stdio\php-sdk目录下又多了一个php54dev目录。

接着继续将deps解压到

f:\php_stdio\php-sdk\php54dev\vc9\x86\

目录下。原来这个目录下的deps目录下的所有子目录均是空目录,解压后,应该复制进很多必要的模块/扩展所需的库文件。

接下来,将PHP-5.4.5源码目录复制一份到

f:\php_stdio\php-sdk\php54dev\vc9\x86\

目录下。进入php源码目录

cd f:\php_stdio\php-sdk\php54dev\vc9\x86\php-5.4.5

运行

buildconf

然后就可以先试着编译php了。最开始,一般编译尽可能少的模块,先让核心能正常编译出来:

configure --disable-all --enable-cli

这一步的主要目的是生成config.w32.h,如果需要生成PHP,可以继续执行

nmake clean; nmake

php5.4最核心部分及一个命令行工具就编译出来了。nmake clean是为了避免遗留编译中间结果文件带来干扰。


三、创建新扩展my_fopen

PHP扩展的基础结构相同,为方便开发PHP提供了ext_skel和ext_skel_win32.php分别是linux、windows下的扩展骨架搭建工具。

此次讲的是Windows中搭建PHP扩展开发环境,所以使用的是ext_skel_win32.php。用它生成的新扩展骨架,可以直接用VS打开。

1.png/

上图是ext_skel_win32.php支持的参数

常用的主要是--extname和--proto:

extname:指定扩展的名称

proto:为了便于快速构建函数骨架,可以创建一个文件,并写入各函数的定义。

cd f:\php_stdio\php-sdk\php54dev\vc9\x86\php-5.4.5\ext  
php ext_skel_win32.php --extname=my_fopen

2.png/

出现上述执行结果,表示新扩展骨架生成成功,现在打开f:\php_stdio\php-sdk\php54dev\vc9\x86\php-5.4.5\ext可以看到my_fopen文件夹。进入my_fopen可以看到my_fopen.dsp,它就是VS的项目文件。

现在可以开发你想要的扩展程序了。

3.png/


四、编译、使用扩展

目前新建的扩展中并未创建任何函数接口,但默认的扩展为我们提供了一个测试的函数接口,

默认函数的命名规则是:confirm_[extname]_compiled

函数接口:tring confirm_[extname]_compiled(string)


1.用VS打开my_fopen.dsp

2.设置项目属性-》配置属性-》C/C++-》代码生成,设置运行库:多线程 DLL (/MD)

3.设置项目属性-》配置:切换到Release_TS

4.png/

4.设置项目属性-》配置属性-》C/C++-》高级,设置编译为:编译为 C 代码 (/TC)

5.设置项目属性-》配置属性-》链接器》常规,设置输出文件:Release_TS/php_my_fopen.dll。

如果不设置,当编译生成扩展后,找起来会比较麻烦。所以这项设置不是必须的。

6.设置项目属性-》配置属性-》链接器》常规,增加附加库目录:F:\php_work\php-5.4.5\dev

如果不设置此选项,编译时会报:无法打开输入文件“php5ts.lib”

7.最后按F5,执行编译。会生成php_my_fopen.dll

5.png/

成功1个,表示dll生成成功。


现在扩展已经编译成功,接下来是在PHP中使用它。

8.拷贝php_my_fopen.dll至F:\php_work\php-5.4.5\ext下

8.打开F:\php_work\php-5.4.5\php.ini,添加extension=ext/php_my_fopen.dll

9.新建F:\php_work\test.php

<?php

echo confirm_my_fopen_compiled("test");


五、编译新扩展遇到的问题

1.fatal error C1902: 程序数据库管理器不匹配;请检查安装

mspdbsrv.exe 或 mspdbcore.dll 丢失或者其版本和 mspdb80.dll 的版本不同,确定这三个文件的相同版本安装在系统里。

在VC安装目录下的\Common7\IDE 目录下拷贝这三个文件到 安装目录下的VC\bin下即可


2. ../main/config.w32.h打开失败

PHP源码进行configure后才会产生config.w32.h


3.无法打开输入文件“php5ts.lib”

设置工程属性页中的C++->高级->编译为改为编译为C代码(/TC),链接器->附加库目录加一项PHP二进制包的dev目录。


使用Sublime开发PHP扩展


一、使用命令行编译VS项目

无需再用VS来进行开发PHP扩展。这样可以配合任意你喜欢的开发工具。

使用VS_ROOT\Common7\IDE\devenv.exe进行编译

具体使用方法可以使用devenv /?,输出帮助查看

6.png/

@VS_ROOT:表示VS安装路径


二、在扩展目录中新建build.bat,并输入

devenv EXTENSION_NAME.sln /build 版本名
@EXTENSION_NAME:表示VS项目的主文件
@版本名:例如DEBUG、Release_TS或Release_NTS


三、新建Sublime构建系统(Build System)

7.png/

输入:

{
     "cmd": ["build.bat"],
     "working_dir": "${file_path}",
     "encoding": "gb2312"
}

然后,保存构建系统名称为 PhpExtension-Mysql.sublime-build


四、将PHP扩展文件夹建立为Sublime项目

1.选择PHP扩展所在路径。

8.png/

例如:E:\php-sdk\php54dev\vc9\x86\php-5.4.5\ext\my_mysql

此时能看到左侧已经出现PHP扩展的项目。

9.png/

现在要编译扩展将会十分简单:ctrl+B。1351123730_2154.png/


五、AutoCompelete、CTags,帮助提示PHP内核中的API

安装alternative_autocompletion插件.

现在你可以开发你想要的扩展了。

10.png/




VS2012开发调试PHP扩展


开发中必不可少的环节就是调试,而调试的方式直接影响到开发效率和软件质量。

之前开发PHP扩展,一直不会DEBUG调试,每次调试都是重新编译、执行再运行PHP脚本看运行状况再调试。太痛苦、太影响效率了。也百度、谷歌了如何调试PHP扩展的问题,但回答的几乎都是GDB,可惜也不知道如何实际操作。

VS用的不多,很多功能也不知道干嘛的,前几天有位同事说可以用VS的“附加到进程”来调试PHP的扩展,我擦~突然感觉有救了。当然也是因为我对C的调试不熟悉导致的。


进入主题:

一、搭建Windows的PHP扩展开发环境

见文章上面介绍。


二、配置调试环境

1.下载PHP_DEBUG_PACK文件

http://windows.php.net/download/#php-5.4

a.png/

选择时,注意必须与下载的PHP二进制版本相同,例如你在第一步搭建PHP开发环境时,选择的是VC9 x86 Non Thread Safe,那么DEBUG PACK就应该下载相同版本的DEBUG PACK。


2.引入符号文件

Debug pack压缩包里是所有PHP调试相关的符号文件(*.pdb),引入他们是调试的关键。

项目-》属性-》调试-》符号-》将解压路径添加入符号位置

b.png/


3.扩展开启DEBUG信息

项目-》属性-》链接器-》调试-》生成调试信息-》设置为“是”

c.png/编译生成Release版本DLL时,会生成vc110.pdb,将它也放入前面解压的PDB路径,为了统一命名格式,可以将其改名与扩展同名。此处我本机改的是“php_test.pdb”

d.png/

至此配置已经完成了,接下来看如何使用调试。


三、附加到进程

1.写一段PHP脚本,并在终端运行且常驻进程。

<?php  
while(1){  
     echo confirm_test_compiled('11');  
     sleep(4);  
}

此处,常驻并非必须的。只是我本地为测试方便。


2.添加断点位置

e.png/


3.附加进程

调试-》附加到进程:选择上面1中执行PHP产生的进程。

f.png/


现在,只需等待程序运行到断点位置即可看到调试信息:

g.png/


本文来自:http://blog.csdn.net/a600423444?viewmode=contents