记录一次Apache2.4启动PHP的Curl扩展不成功的问题
最近由于公司的一个系统需要低版本的VS(2015),而我的电脑上的VS比较高,开发的时候有时候会不正确,所以需要安装低版本的VS。
当我进行安装后发现无法装上,因为高版本已经存在了。
而我卸载掉后再进行安装,依然会出错。
没有办法,我只能把出错的版本卸载掉,但因为VS2015的Update版本有一个Update包,在卸载时等了一个小时都无法过,我就没有再等,强制关掉了卸载程序,悲剧上演。
我从微软的Github上下载了TotalUninstall来强制卸载VS2015。
经过几次失败后,发现终于卸载掉了(反正菜单项中是没有了,控制面板里也没有了)
回头却发现我很多程序不能运行了,经查发现系统的Path变量基本被清空了。
而Apache2.4就是其中之一。
查看系统的事件日志,发现与C:\windows\system32\ADVAPI32.dll文件加载错误。
在Apache的Error.log中看到:
[core:warn] [pid 516:tid 668] AH00098: pid file httpd.pid overwritten -- Unclean shutdown of previous Apache run?
经查这个问题是PHP的问题,把PHP模块禁用后,确实启动成功。
于是想干脆把PHP的版本换成8,从官网上下载最新的版本后,将原来的配置拷贝进去后,发现还是无法启动。
从网上查到这其实是配置变化了,在PHP8里,Apache的加载项是:LoadModule php_module "<path>/php8apache2_4.dll",而不是LoadModule php8_module "<path>/php8apache2_4.dll"
成功启动了Apache后,却发现系统日志中有几个extension都无法加载
将ext目录配置为绝对路径(其实不需要),将php的主目录添加入 Path变量后,Curl扩展依然无法启动。
从网上查到说是缺少libeay32.dll和ssleay32.dll文件
从网上下载,本地查到,拷贝到System32目录下,依然无效。
正想放弃的时候,又回头看了看系统的日志,发现加载php_curl扩展加载失败,下面有提示启动服务的命令行参数。
于是在命令行下按提示的命令行参数运行:
httpd -k -d <apache_root_path> -f <apache_conf_file>
弹出提示:
apache2.4无法切入点nghttp2_option_set_no_rfc9113_leading_and_trailing_ws_validation
在搜索引擎中一搜索,发现这个其实是因为:PHP_Curl需要的nghttp2.dll不 一样,Apache的Bin目录下同样有这个文件,而PHP也有,两个文件不一致,在Apache中,优先使用了Apache目录下的文件,自然不对。
解决办法当然就是:
从PHP的根目录中,将nghttp2.dll文件拷贝到Apache的Bin目录下 (记得备份哦)。
重启Apache,问题解决。