编译php内核必要工具phpsdk,如何切换vc15工具集版本?
发布于 作者:苏南大叔 来源:程序如此灵动~
大家一般很少部署生成环境到windows系统,所以一般来说,都是在类linux环境下使用php的。而事实上,在windows环境下,也是可以运行php内核的。编译的话,相对而言是麻烦一些。所以,如果您在windows环境下,使用php.exe。最好的办法是直接下载。如果,您是想体验一下编译php内核的乐趣的话,那就一起来吧。

大家好,这里是苏南大叔的“程序如此灵动”博客,这里讲述苏南大叔和计算机代码的故事。本文讲述,在`windows环境下编译php内核的第一步,下载phpsdk,并对phpsdk做点小的分析修改。本文测试环境:win10,vs2017,phpsdk@2.2.1-dev。
合适的编译环境
首先需要明确要编译的php内核的版本,因为不同的内核有着不同的推荐编译器版本。下面的文章里面,有着官方推荐的编译器和内核的列表:
苏南大叔的目标php内核版本是目前最新的php@7.4.28,所以选择的编译器版本是vs2017。具体的选择过程,可以参考下面的文章:

下载并安装好合适的vc141工具集之后,就是需要下载php官方推荐的phpsdk工具集了。地址见下方:
- 【推荐】 https://github.com/php/php-sdk-binary-tools
- 【疑废】 https://github.com/microsoft/php-sdk-binary-tools
下载后解压到合适的位置,可以看到目录结构如下:

这里的vc14、vc15、vs16的字样,是phpsrc方面对visual studio里面的vc工具集的简称。其中,vc15这个命名中的vc字样,是个美丽的误会,导致的错误命名。后续使用vs来命名,修正了这个错误。(其实是visual studio不按套路出牌,导致的误会。)
phpsdk与vcvarsall.bat
phpsdk的逻辑,实际上就是根据目标特征(例如vc15,x64)寻找本机的vc环境,然后调用visual studio里面对应的vcvarsall.bat,进而设置cl.exe为代表的工具集路径的过程。
根目录下面的几个.bat文件的调用关系如下:

phpsrc代码逻辑的小缺陷
php@7.4可以识别1916,php@7.2无法识别1916。所以下文所说的都是最新版vs2017编译php@7.2。
是否识别为vc15而不是untested是在phpsrc里面configure.js里面所决定的,而这个文件是来自于phpsrc\win32\build\confutils.js文件。在php7.2代码中,可以看到:代码并不认识1916,只认识1911和1912。然而,php@7.4.28的同位置代码,却并没有1911或者1912的设定,可以完美识别1916。所以,以下的更改,只是在描述phpsrc@7.2系列为代表的源码。相关代码仅供参考,并没有太大的价值。

苏南大叔要使用的vs2017里面的vc15,然而其默认的1916工具集是phpsrc官方所不推荐的。而phpsdk里面又没有给出对应的切换方式。根据苏南大叔的测试,1916工具集作为vc15的一份子,是能够正常工作的。然而phpsrc官方的态度就是:能工作就是不推荐。
所以,当您使用vc15对应的.bat文件的时候,您也许可以:
- 安装
vs2017组件里面的14.12工具集,其实就是1912工具集。 - 然后修改
phpsdk里面的逻辑,主动传入参数-vcvars_ver=14.12。
这样的话,就是使用官方推荐的vc15小版本里面,较新的1912了。主要修改文件如下:
这里是苏南大叔原创的内容,转载请保留版权信息。
phpsdk-vc15-x86.bat/phpsdk-vc15-x64.bat,不做修改。phpsdk-starter.bat:
if /i "%1" equ "-vcvars_ver" set vcvars_ver=%2 & shift
//...
title PHP SDK %CRT% %ARCH% %vcvars_ver%
call %PHP_SDK_ROOT_PATH%\bin\phpsdk_setshell.bat %CRT% %ARCH% %vcvars_ver%

bin\phpsdk_setshell.bat:
if "%3"=="" (
set PHP_SDK_VS_SHELL_CMD="!PHP_SDK_VC_DIR!\Auxiliary\Build\vcvarsall.bat" amd64
) else (
set PHP_SDK_VS_SHELL_CMD="!PHP_SDK_VC_DIR!\Auxiliary\Build\vcvarsall.bat" amd64 -vcvars_ver=%3
)
if "%3"=="" (
set PHP_SDK_VS_SHELL_CMD="!PHP_SDK_VC_DIR!\Auxiliary\Build\vcvarsall.bat" x86
) else (
set PHP_SDK_VS_SHELL_CMD="!PHP_SDK_VC_DIR!\Auxiliary\Build\vcvarsall.bat" x86 -vcvars_ver=%3
)
这样修改后,就可以给phpsdk传递-vcvars_ver参数了,和vcvarsall.bat的官方使用体验完全一致。例如:
phpsdk-vc15-x64.bat -vcvars_ver=14.12phpsdk-vc15-x86.bat -vcvars_ver=14.12
参考文献
总结
本文仅仅是说了windows环境下,编译php内核的第一步phpsdk,或者说,只是一个对phpsdk的大体认识篇。更多php内核编译的文章,请参考下面的链接: