记录一次Apache2.4启动PHP的Curl扩展不成功的问题

发布时间 2023-12-25 00:05:31作者: Elphly

最近由于公司的一个系统需要低版本的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,问题解决。