window server 2012安装php7.x
背景
正常情况下window上装php直接根据对应版本的vc++进行安装即可,但是window server上的vc++没有办法直接安装成功。
不只winserver,经测试win7也有同样问题。
场景复现
系统环境:window server 2012 R2 Standard Build 9600
php环境:phpstudy+php 7.x
先看问题
提示缺少VCRUNTIME140.dll
,如果配的是更高版本的apache如2.4.43也会有这个提示。
win7下提示缺少api-ms-win-crt-runtime-l1-1-0.dll
。
注意:winserver一定要跑命令行才能发现这个问题,不跑命令行不会弹这个提示;phpstudy能开apache,但是php页面进去会是500。
解决
经过检索得知:没有安装vc2015。
去microsoft直接下载安装,winserver会提示设置失败。
提示里有个日志文件,可以点进去看看。并尝试检索error
可以看到是有个补丁安装失败了,试一下手动安装看看。
提示不适用计算机,接下来直接检索这个补丁名字。得到以下命令,复制逐一运行,补丁路径一定要对应。
执行完回来再双击vc2015安装,这里就直接点“修复
”按钮即可。发现安装成功了。
那就检查一下php 7.4能不能跑了,还是缺dll,很奇怪。
来回检查一遍过后,原来我装的php7.4是32位的,但装的vc2015是64位的,原来vc需要对应的是php版本而不是win版本。
注:oci8扩展也是这样,需要对应php位数,但oracle客户端windows版本只有32位的,所以php只能装32的。
那现在下载一个vc2015-x86安装试一下,顺便测试一下64/32能不能共存。
不行,开始缺失api-ms-win-crt-runtime-l1-1-0.dll
了。
这里分析两种可能,1:64/32不能共存,2:php7.4还需要其他版本的vc。一步一步来:
- 卸掉64位vc2015,并修复32位vc。发现依然不行
- 既然7.4不行,那就换32位的7.3~7.0试一下。一顿操作下来一样不行。
那就检索api-ms-win-crt-runtime-l1-1-0.dll
最终测试成功的方案是继续装两个补丁KB2919442
、KB2919355
,注意:这个补丁就要对应自己系统的位数了。
KB2919442:https://www.microsoft.com/zh-cn/download/confirmation.aspx?id=42162
KB2919355:https://www.microsoft.com/zh-cn/download/details.aspx?id=42334
KB2919355是有多个补丁集合的,要全部下载下来。
先安装KB2919442,KB2919355补丁集合的安装顺序:clearcompressionflag.exe
、KB2919355
、KB2932046
、KB2959977
、KB2937592
、KB2938439
、KB2934018
。clearcompressionflag.exe可能就是清理一下数据或者缓存的,执行了没反应双击会一闪而过。
注意:补丁安装过程中会有重启操作,如果是生产环境需要等业务空闲时安装,整个过程需要20-30分钟
以下是官方说法:
按步骤安装完成后,再回头安装vc2015。就绪之后,跑php发现虽然不提示缺dll,但是出warning了。
老样子,根据warning检索。
最后得知php7.4是需要安装vc2015-2019,注意这是一个文件不是多个。那是不是意味着7.4以下的在这个环境中能正常使用。
验证猜想:
php7.3无异常,那么就继续解决php7.4问题,直接去下载vc2015-2019,通过百度或者微软官方都可以检索到。关键词:Microsoft Visual C++ 2015-2019 Redistributable
x64:https://aka.ms/vs/16/release/vc_redist.x64.exe
x86:https://aka.ms/vs/16/release/vc_redist.x86.exe
安装后问题得到解决,发现php7.4-x64也能正常使用。