19

使用 https:// url 调用 file_get_contents() 会出现以下错误:

warning: file_get_contents(): Unable to find the wrapper "https" - did you forget to enable it when you configured PHP?

我已经阅读了 10 多个 SO 问题,他们都说要启用extension=php_openssl.dll

我这样做了,但我仍然遇到问题...

还能是什么?

4

8 回答 8

25

解决了

要解决此错误,您需要在您的网络服务器OpenSSL上安装PHP 包。

FreeBSD服务器上,您可能需要安装以下软件包:php53_openssl并重新启动您的网络服务器。

Windows服务器上,打开您的php.ini配置文件并简单地取消注释以下行:

 ;extension=php_openssl

并重新启动网络服务器。错误应该得到解决。

参考:我从这个对我有用的链接中学到了它..,所以归功于他。

于 2017-04-20T07:58:17.820 回答
8

在 Windows 上较新版本的 PHP 上,接受的答案将不起作用。

对于 PHP 7.x,您需要取消注释(删除行首;的)以下行:

extension_dir = "ext"
extension=openssl

于 2020-08-18T01:50:06.400 回答
3

对于 Windows 64 位上的 PHP 7,请务必放入libcrypto-1_1-x64.dll环境变量路径。例如:C:\php\libcrypto-1_1-x64.dll;

于 2019-03-14T15:20:47.393 回答
3

我只是想添加这个花絮,因为我在这个问题上挣扎了几个小时,终于找到了可行的方法。对于许多此类 WAMP/XAMP/MAMP 安装,配置文件被放置在非标准目录中(即 C:\MAMP\conf\php\php7.2.10\php.ini)。您需要确保您的 php cli 已加载您正在修改的 INI。

$ php --ini

如果它没有指向正确的 INI,或者根本没有加载任何配置文件,您可以更改执行脚本的用户的 PHPRC 环境变量,以指向您已正确修改的 INI 的正确位置。此外,确保 php.ini 中的 extension_dir 参数包含存储扩展的正确路径。

希望这可以帮助。

于 2019-04-26T22:15:35.183 回答
2

请确保在 php.ini 中 allow_url_include 和 allow_url_fopen 是否设置为“开启”。

如果这些行被注释,请取消注释它们。

此外,您可以使用以下脚本进行诊断:(取自已接受的关于如何让 file_get_contents() 与 HTTPS 一起工作的答案?

$w = stream_get_wrappers();
echo 'openssl: ',  extension_loaded  ('openssl') ? 'yes':'no', "\n";
echo 'http wrapper: ', in_array('http', $w) ? 'yes':'no', "\n";
echo 'https wrapper: ', in_array('https', $w) ? 'yes':'no', "\n";
echo 'wrappers: ', var_dump($w);
于 2014-05-14T08:53:12.440 回答
1

就像人们说的,检查配置。

phpinfo.php

<?php
phpinfo();
?>

在网页上搜索 OpenSSL。另外,不要忘记在更改 php.ini 文件后重新启动 WebServer。

如果您不能使用file_get_contents(),请改用 cURL(如果可用),它在许多方面都更好并且更快。

function url($url,$option = null) {

    $cURL = curl_init();

    if ($option) {
        curl_setopt($cURL, CURLOPT_URL, $url.$option);
    } else {
        curl_setopt($cURL, CURLOPT_URL, $url);
    }

    curl_setopt($cURL, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($cURL, CURLOPT_AUTOREFERER, 1);
    curl_setopt($cURL, CURLOPT_HTTPGET, 1);
    curl_setopt($cURL, CURLOPT_VERBOSE, 0);
    curl_setopt($cURL, CURLOPT_HEADER, 0);
    curl_setopt($cURL, CURLOPT_FOLLOWLOCATION, 1);
    curl_setopt($cURL, CURLOPT_SSL_VERIFYPEER, 1);
    curl_setopt($cURL, CURLOPT_SSL_VERIFYHOST, 1);
    curl_setopt($cURL, CURLOPT_DNS_USE_GLOBAL_CACHE, 0);
    curl_setopt($cURL, CURLOPT_DNS_CACHE_TIMEOUT, 2);

    $output['page'] = curl_exec($cURL);
    $output['contentType'] = curl_getinfo($cURL, CURLINFO_CONTENT_TYPE);

    curl_close($cURL);

    return $output;

}

$page = url('https://example.com/','i/like/subfolders');
于 2016-04-25T15:34:23.703 回答
0

我有同样的问题。我试图访问 facebook 图表。不是它无法访问 URL,而是 Facebook 返回 400 错误,因为我没有传递参数。尝试在具有有效 HTTPS 连接的站点上连接到 HTTPS。例如试试这个:

file_get_contents("https://www.namhost.com");

如果这可行,您必须了解您正在连接的 HTTPs 连接失败的原因,因为问题不在于您无法连接到 HTTPs,而是您正在连接的内容不喜欢该请求。

于 2014-05-08T06:53:25.800 回答
0

对我来说,这个问题是由于在 wampserver 3.2.4 上安装 7.1 之后的 PHP 版本和 apache 2.4.23 造成的。7.1 之后的所有 PHP 版本都会产生错误“无法找到包装器“https” - 您在配置 PHP 时是否忘记启用它?” 和“致命错误:SOAP 错误:[HTTP] SSL 支持在此版本中不可用”。

问题的一个重要指标是,在 phpinfo.php 上,“Registered Stream Socket Transports”显示只有 TCP 和 UDP 可用,没有可用的 SSL 传输。

升级到 apache 2.4.46b 解决了所有 SSL 相关问题,“注册流套接字传输”随后包括 ssl、tls、tlsv1.0、tlsv1.1、tlsv1.2 和 tlsv1.3 传输。

于 2021-01-01T06:21:01.587 回答