这是一篇翻译的文章,原文参见:https://wiki.php.net/internals/windows/stepbystepbuild
顺便提一句,wiki.php.net有很多精彩的内容,想深入了解php的同学千万不要错过:)
准备工作
在windows平台上编译php,需要三样准备工作:
1,合适的编译环境,包括安装一个编译器、正确的SDK以及对应的binary tools
2,编译PHP需要用到的第三库、头文件
3,PHP源代码
构建环境
这是在windows平台上编译php最困难的部分,因为建立这样的编译环境需要大量的磁盘空间,可能会有数G
需求:
- Microsoft Visual C++,官方的PHP版本支持VC++6.0和VC++9.0(即VC++2008),Express版本的也行。MinGW和其他的编译器是不被支持的。
- 正确的windows SDK 或者Platform SDK,SDK需要与VC版本对应,详见https://wiki.php.net/internals/windows/windowssdkhttp://windows.php.net/downloads/php-sdk/
注:
最新的php5.5可以用VC++9或者VC++11编译,不过5.5尚未正式发布。
如果使用的是VC6,则需要安装Windows Server Feb.2003 SDK,如果使用的VC9则需安装SDK6.1
构建步骤
1,安装vs2008
2,安装windows sdk 6.1
3,获得php 5.3源码,可以从此处获取snapshot(先不要解压)
4,创建文件夹c:\php-sdk
5,解压binary-tools.zip 至c:\php-sdk文件夹中。binary-tools.zip可以从此处获取(http://windows.php.net/downloads/php-sdk/)。解压后C:\php-sdk中应该包含bin,script,share等子目录。
6,打开windows sdk 6.1 shell,直接下述指令:
PHP 5.2, 5.3 and 5.4:
setenv /x86 /xp /release
PHP 5.5+:
setenv /x86 /2008 /release
7,
cd c:\php-sdk\
8,
bin\phpsdk_setvars.bat
9,
bin\phpsdk_buildtree.bat php53dev
10,现在解压第3步中下载的snapshot至C:\php-sdk\php53dev\vc9\x86文件夹中。解压完成之后,目录路径形如C:\php-sdk\php53dev\vc9\x86\php5.3-xyz。
11,在C:\php-sdk\php53dev\vc9\x86中,有一个deps文件夹。下载编译所依赖的一些libraries,并且解压至其中。这些libraries可以从http://wiki.php.net/internals/windows/libs获得。确保解压完成之后,deps下包含/include和/lib目录。(注:笔者直接从http://windows.php.net/downloads/php-sdk/下载了deps-5.3-vc9-x86.7z可以顺利编译通过)
12,继续在windows-sdk-shell中运行
cd C:\php-sdk\php53dev\vc9\x86\php5.3-xyz
13,
buildconf
14,查看编译选项
configure –help
15,根据自己的需要输入构建指令:
configure –disable-all –enable-cli 编译最简单的PHP内核并且只支持cli运行方式
configure –disable-all –disable-zts –enable-cli –enable-debug –enable-mbstring –enable-session –enable-sockets –enable-json
(注: 一些扩展需要lib,头文件甚至其他程序,详见libs ,下载自己所需的版本并且解压至deps文件夹c:\php-sdk\php53\vc9\x86\deps)
16,
nmake
17,如果你需要压缩编译好的php文件,继续执行:
nmake snap
18,编译完的PHP位于C:\php-sdk\php53dev\vc9\x86\php5.3-SNAPSHOTTIME\Release_TS目录。
修改并重新编译
1,清除上次的编译结果
nmake clean
2,如果你需要重新config
buildconf –force
3,输入新的configure配置
configure –disable-all –enable-cli –enable-$remains
4,编译
nmake
如果只编译最精简的PHP(仅enable-cli),编译成功之后,可以观察一下编译了哪些EXT,SAPI:
<img src="data:image/png;base64,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" alt="" />
除了standard(标准扩展),这个php版本只含有date,ereg,pcre,reflection,SPL几个扩展,它们的源码都可以在php-src/ext中找到。