Windows下Apache+PHP8.1所有扩展无法加载故障如何排查
核心排查步骤
第一步:修正extension_dir为绝对路径
你当前配置的extension_dir = "ext"是相对路径,Apache加载mod_php模块时,相对路径的基准目录是Apache自身的bin目录(即C:\Webserver\Apache24\bin),不会自动定位到PHP目录下的ext文件夹,这是报错的核心原因。直接将php.ini中该项修改为绝对路径:extension_dir = "C:\Webserver\php\ext"修改完成后先不要急着重启,继续排查后续配置项。
第二步:确认修改的是正确生效的php.ini
很多场景下用户修改的是php目录下的示例配置文件(php.ini-development/php.ini-production),而非实际加载的配置文件。在Apache站点根目录新建phpinfo.php,写入如下代码:<?php phpinfo();访问该文件后找到Loaded Configuration File项,记录对应的文件路径,确认你之前修改的php.ini就是该路径下的文件,改错文件的话所有配置都不会生效。
第三步:配置系统Path环境变量解决依赖缺失
curl、openssl这类扩展除了自身的dll文件,还依赖PHP根目录下的公共运行库(比如libcrypto-3-x64.dll、libssl-3-x64.dll、libssh2.dll等),Apache进程默认不会去PHP目录下检索这些依赖,就算extension_dir配对了也会报找不到模块:- 按Win+R输入
sysdm.cpl回车打开系统属性面板,切换到「高级」选项卡,点击「环境变量」按钮 - 在系统变量列表中找到
Path项,点击编辑,新增两个条目:C:\Webserver\php、C:\Webserver\php\ext - 保存所有设置后,必须重启Windows系统(或重启Apache对应的系统服务,确保服务进程读取到最新的环境变量)
- 按Win+R输入
第四步:校验版本匹配性
- 确认安装的PHP是线程安全(TS)x64版本:Apache的mod_php运行模式仅兼容线程安全版PHP,非线程安全(NTS)版本搭配Apache会出现扩展加载异常。访问之前创建的phpinfo页面,找到Thread Safety项,显示为enabled即为符合要求。
- 确认Apache目录下的
php8apache2_4.dll文件来自你当前安装的PHP8.1.7版本包,不要混用其他PHP版本的Apache运行模块。 - 打开
C:\Webserver\php\ext目录,确认目录下存在php_curl.dll、php_mbstring.dll、php_openssl.dll三个文件,文件缺失的话重新下载官方对应版本的PHP压缩包解压覆盖即可。
第五步:验证加载结果
重启Apache服务后再次访问phpinfo页面,搜索curl、mbstring、openssl三个关键词,能找到对应扩展的配置区块即为加载成功。也可以打开命令提示符,切换到C:\Webserver\php目录执行php -m,查看输出的扩展列表中是否包含这三个扩展。
注:之前给Webserver目录开放everyone完全控制权限的操作对解决该问题没有帮助,反而会带来服务器安全风险,排查完成后记得删除该权限配置。
内容的提问来源于stack exchange,提问作者sitox

