为什么我在 Apache 上file_get_contents遇到“无法找到包装器 https”错误,尽管在 php.ini 中配置了 openssl?

Why am I getting 'Unable to find the wrapper https' error with file_get_contents on Apache, despite openssl config in php.ini?

提问人:enlace 提问时间:6/3/2023 最后编辑:enlace 更新时间:6/4/2023 访问量:72

问:

当我通过 apache 执行file_get_contents时,我收到错误:“无法找到包装器 https”。 我已经在php.ini中配置了extension=openssl。 我尝试通过使用

echo var_dump(stream_get_wrappers());

结果显示

screenshot from apache.

看来https包装器确实不见了。

但是file_get_contents在 PHP 交互式 shell 下运行良好,并且stream_get_wrappers显示包装器已加载为

screenshot from php interactive shell

Apache 和 PHP Shell 之间出现这些不同行为的原因可能是什么? 非常感谢您的任何提示

环境:Apache 2.4.57 Win64 + PHP 8.2 (8.2.6) VS16 x64 线程安全


我通过安装另一个Apache版本来解决这个问题。php.ini 和 httpd.conf 是相同的。 特别感谢大家的友好支持@hakre

php apache https openssl 文件获取内容

评论

2赞 ADyson 6/3/2023
每个环境(shell 和 web)都有不同的 PHP 配置文件,因此它们当然可以有不同的行为和设置。
0赞 enlace 6/3/2023
谢谢,在哪里可以找到 shell 使用的配置文件?我认为shell和apache(web)使用相同的配置文件,即php.ini。如果我像(extension=mysqli)一样注释和取消注释扩展,它确实对shell和apache中的php执行都有影响。
0赞 ADyson 6/3/2023
如果你运行phpinfo(),它应该告诉你

答:

0赞 hakre 6/3/2023 #1

Apache 和 PHP Shell 之间出现这些不同行为的原因可能是什么?

这可以直接回答:两者都有不同的PHP配置。

您的 PHP shell 启用了 https 包装器,而您的 Apache PHP 禁用了它。

这通常很容易被忽视,尤其是在开始时,因为我们认为这都是 PHP,所以假设这必须是一样的。

但事实是,PHP有许多不同的所谓服务器应用程序编程接口(SAPI),它们都有自己的配置。

与PHP手册比较:php_sapi_name()


在 shell 中,PHP 通常是命令行界面 (CLI) SAPI。

在 Web 服务器中,如 Apache,这取决于,它可以是通用网关接口 (CGI)、Apache 模块或快速 CGI (FCGI) 进程管理器 (FPM)。

一个潜在的陷阱

定义的 SAPI 可能并不明显,因为例如,可以将其定义为 。参考文献apacheapache2handler


后果

enlace 随后在评论中询问了两个特定的 PHP SAPI 配置:

  1. 在哪里可以找到 shell 的 php 配置文件?

对于 shell,execute ,输出包含 PHP ini 文件在开头的位置(管道 to,因为它包含大量信息)。php -imore

  1. 如何正确配置php .ini(用于apache)。我确实启用了,但它不起作用。extension=openssl

对于 apache Web 服务器,请仔细检查您编辑了正确的 ini 文件,使用 phpinfo() 将 ini 位置和设置显示为默认/有效。

一些SAPI(如Apache中的一些SAPI)也允许您在服务器配置本身中配置PHP设置。有关更多详细信息,请参阅 PHP 手册中有关配置的部分。该部分称为运行时配置

此外,还要确定 SAPI,以便更好地了解运行时是什么以及如何配置它。

评论

0赞 enlace 6/3/2023
首先感谢您的解释。1. 在哪里可以找到 shell 的 PHP 配置文件?2. 如何正确配置 php.ini(适用于 Apache)。我确实启用了 extension=openSSL,但它不起作用
0赞 hakre 6/3/2023
@enlace:多亏了你的评论,我编辑了对答案的进一步澄清。
0赞 enlace 6/3/2023
所以phpinof()显示>>加载的配置文件-> C:\workspace\php\php.ini >>配置文件(php.ini)路径->没有值>>扫描此目录以查找其他.ini文件->(无)它确实读取了php.ini我配置了(PHPIniDir“C:/workspace/php”),并且像mysqli这样的模块运行良好。(在C:/workspace/php/php.ini中注释和取消注释extension=mysqli确实有效。只有对 extension=openssl 的修改似乎不起作用。不知道问题出在哪里......
0赞 hakre 6/3/2023
@enlace:对不起,我离开了键盘,现在正在阅读你的消息。这看起来只有一个配置文件(),这应该使它在你的情况下变得简单。现在关于扩展。 对我来说看起来是正确的(在 Windows 上的旧 php 版本中,但 IIRC 这早于 PHP 5.6,所以仅供参考 Microsoft Windows 上的扩展文件名(动态链接库 - DLL)。还有一个设置叫做,试着找出其中的扩展文件。1/2C:\workspace\php\php.iniextension=opensslextension=openssl.dllextension_dir
0赞 hakre 6/3/2023
2/2 此外,如果无法加载扩展,您可能会在诊断通道上找到消息。Apropos:由于扩展是在PHP启动时加载的,因此当您更改扩展的配置时,您需要重新启动/重新加载PHP,例如在php .ini配置更改后重新启动Apache Web服务器,然后再次比较输出。phpinfo()