我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...

大家一般很少部署生成环境到windows系统,所以一般来说,都是在类linux环境下使用php的。而事实上,在windows环境下,也是可以运行php内核的。编译的话,相对而言是麻烦一些。所以,如果您在windows环境下,使用php.exe。最好的办法是直接下载。如果,您是想体验一下编译php内核的乐趣的话,那就一起来吧。

苏南大叔:编译php内核必要工具phpsdk,如何切换vc15工具集版本? - phpsdk-tools
编译php内核必要工具phpsdk,如何切换vc15工具集版本?(图10-1)

大家好,这里是苏南大叔的“程序如此灵动”博客,这里讲述苏南大叔和计算机代码的故事。本文讲述,在`windows环境下编译php内核的第一步,下载phpsdk,并对phpsdk做点小的分析修改。本文测试环境:win10vs2017phpsdk@2.2.1-dev

合适的编译环境

首先需要明确要编译的php内核的版本,因为不同的内核有着不同的推荐编译器版本。下面的文章里面,有着官方推荐的编译器和内核的列表:

苏南大叔的目标php内核版本是目前最新的php@7.4.28,所以选择的编译器版本是vs2017。具体的选择过程,可以参考下面的文章:

苏南大叔:编译php内核必要工具phpsdk,如何切换vc15工具集版本? - 需要vs2017环境
编译php内核必要工具phpsdk,如何切换vc15工具集版本?(图10-2)

下载并安装好合适的vc141工具集之后,就是需要下载php官方推荐的phpsdk工具集了。地址见下方:

下载后解压到合适的位置,可以看到目录结构如下:

苏南大叔:编译php内核必要工具phpsdk,如何切换vc15工具集版本? - phpsdk目录结构
编译php内核必要工具phpsdk,如何切换vc15工具集版本?(图10-3)

这里的vc14vc15vs16的字样,是phpsrc方面对visual studio里面的vc工具集的简称。其中,vc15这个命名中的vc字样,是个美丽的误会,导致的错误命名。后续使用vs来命名,修正了这个错误。(其实是visual studio不按套路出牌,导致的误会。)

phpsdkvcvarsall.bat

phpsdk的逻辑,实际上就是根据目标特征(例如vc15x64)寻找本机的vc环境,然后调用visual studio里面对应的vcvarsall.bat,进而设置cl.exe为代表的工具集路径的过程。

根目录下面的几个.bat文件的调用关系如下:

苏南大叔:编译php内核必要工具phpsdk,如何切换vc15工具集版本? - 逻辑关系图
编译php内核必要工具phpsdk,如何切换vc15工具集版本?(图10-4)

phpsrc代码逻辑的小缺陷

php@7.4可以识别1916php@7.2无法识别1916。所以下文所说的都是最新版vs2017编译php@7.2

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

苏南大叔:编译php内核必要工具phpsdk,如何切换vc15工具集版本? - 识别1916
编译php内核必要工具phpsdk,如何切换vc15工具集版本?(图10-5)

苏南大叔要使用的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%

苏南大叔:编译php内核必要工具phpsdk,如何切换vc15工具集版本? - 修改1
编译php内核必要工具phpsdk,如何切换vc15工具集版本?(图10-6)

苏南大叔:编译php内核必要工具phpsdk,如何切换vc15工具集版本? - 修改2
编译php内核必要工具phpsdk,如何切换vc15工具集版本?(图10-7)

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
)

苏南大叔:编译php内核必要工具phpsdk,如何切换vc15工具集版本? - 修改3
编译php内核必要工具phpsdk,如何切换vc15工具集版本?(图10-8)

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
)

苏南大叔:编译php内核必要工具phpsdk,如何切换vc15工具集版本? - 修改4
编译php内核必要工具phpsdk,如何切换vc15工具集版本?(图10-9)

这样修改后,就可以给phpsdk传递-vcvars_ver参数了,和vcvarsall.bat的官方使用体验完全一致。例如:

phpsdk-vc15-x64.bat -vcvars_ver=14.12
phpsdk-vc15-x86.bat -vcvars_ver=14.12

苏南大叔:编译php内核必要工具phpsdk,如何切换vc15工具集版本? - 调用方式
编译php内核必要工具phpsdk,如何切换vc15工具集版本?(图10-10)

参考文献

总结

本文仅仅是说了windows环境下,编译php内核的第一步phpsdk,或者说,只是一个对phpsdk的大体认识篇。更多php内核编译的文章,请参考下面的链接:

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。

 【福利】 腾讯云最新爆款活动!1核2G云服务器首年50元!

 【源码】本文代码片段及相关软件,请点此获取更多信息

 【绝密】秘籍文章入口,仅传授于有缘之人   phpsrc