找不到带有file_get_contents的包装器“https”


Unable to find the wrapper "https" with file_get_contents

使用 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

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

还能是什么?

解决

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

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

Windows 服务器上,打开php.ini配置文件,只需取消注释以下行:

 ;extension=php_openssl

,然后重新启动网络服务器。应解决该错误。

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

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

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

extension_dir = "ext" extension=openssl

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

我只是想添加这个花絮,因为我在这个问题上挣扎了几个小时,终于想出了一些有用的东西。对于许多这样的 WAMP/XAMP/MAMP 安装,配置文件被放置在非标准目录中(即 C:''MAMP''conf''php''php7.2.10''php.ini)。您需要确保您的 php cli 已加载您正在修改的 INI。

$ php --ini

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

希望这有帮助。

请确保在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);

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

phpinfo.php

<?php
phpinfo();
?>

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

如果您不能使用 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');

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

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

如果这有效,您必须了解为什么您连接到的HTTP连接失败,因为问题不在于您无法连接到HTTP,而是您连接到的内容不喜欢该请求。

对我来说

,这个问题是由于在wampserver 3.2.4上安装带有apache 2.4.23的7.1之后的PHP版本引起的。7.1 之后的所有 PHP 版本都会产生错误"找不到包装器"https" - 您在配置 PHP 时忘记启用它吗?"和"致命错误:SOAP 错误:[HTTP] SSL 支持在此版本中不可用"。

这个问题的一个重要指标是,在phpinfo.php上,"注册流套接字传输"显示只有TCP和UDP可用,没有可用的SSL传输。

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