Apache下file_get_contents报https wrapper缺失,已配置openssl仍异常
Apache环境下PHP https包装器缺失但CLI正常的原因分析
问题场景
在Apache 2.4.57 Win64 + PHP 8.2.6(VS16 x64 Thread Safe)环境中,通过Apache运行PHP脚本调用file_get_contents()请求HTTPS地址时,触发错误:
Unable to find the wrapper https
已在php.ini中启用extension=openssl,执行以下代码检查可用包装器:
echo var_dump(stream_get_wrappers());
结果确认https包装器未加载;但切换到PHP交互式shell(CLI模式)时,file_get_contents()可正常处理HTTPS请求,stream_get_wrappers()也显示https包装器已正常加载。
可能的原因
- 配置文件不统一:Windows环境中,Apache加载的
php.ini可能与CLI模式使用的不是同一个文件。比如Apache可能读取了PHP安装目录外的配置文件(如Apache目录下的副本),而该文件未启用openssl扩展;或者因环境变量、Apache配置中的PHPIniDir指令指向错误路径,导致加载了未配置的php.ini。 - 线程安全版的依赖加载问题:PHP线程安全(TS)版本以Apache模块运行时,依赖的OpenSSL动态库(如
libcrypto-1_1-x64.dll、libssl-1_1-x64.dll)可能未被Apache正确加载。CLI模式下PHP会直接加载这些库,但Apache作为系统服务启动时,若系统PATH未包含PHP库目录,或库文件损坏、缺失,会导致OpenSSL扩展初始化失败,进而缺失https包装器。 - 版本兼容性冲突:特定Apache版本与PHP线程安全版本在Windows环境下存在适配问题,导致无法正确初始化OpenSSL扩展。用户更换Apache版本后问题解决且未修改配置,就属于这种情况——原Apache 2.4.57与PHP 8.2.6 TS的组合存在兼容性缺陷,导致扩展加载失败。
解决验证
用户更换其他版本的Apache后,未修改php.ini和httpd.conf配置,问题即解决,进一步印证了版本兼容性冲突是本次问题的核心原因。
内容的提问来源于stack exchange,提问作者enlace
相关产品推荐
相关产品推荐

