无法使用file_get_contents找到包装器“https”

时间:2013-09-05 18:36:53

标签: php apache https file-get-contents

使用https:// urls调用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

我这样做了,我还有问题......

还有什么呢?

8 个答案:

答案 0 :(得分:9)

  

解决

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

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

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

 ;extension=php_openssl

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

参考:我从this link那里找到了它,这对我有用..所以很有信心。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

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

如果可行,您必须明白为什么您要连接的HTTP连接失败,因为问题不是您无法连接到HTTP,而是您要连接的是isn&# 39;不喜欢这个请求。

答案 3 :(得分:0)

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

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');

答案 4 :(得分:0)

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

$ php --ini

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

希望这会有所帮助。

答案 5 :(得分:0)

在Windows上较新版本的PHP上,无法接受的答案。

对于PHP 7.x,您需要取消注释(删除该行开头的let decoder = MyDecoder() return try! decoder.decode(MyRecord.self, from: input) )以下几行:

;
extension_dir = "ext"

答案 6 :(得分:0)

对我来说,这个问题是由于在 wampserver 3.2.4 上安装了 7.1 之后的 PHP 版本和 apache 2.4.23。 PHP 7.1 之后的所有版本都产生错误“无法找到包装器“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 传输。

答案 7 :(得分:-1)

请确保将allow_url_include和allow_url_fopen设置为&#39; On&#39;在php.ini。

如果注释了这些行,请取消注释。

此外,您可以使用以下脚本进行诊断:(取自How to get file_get_contents() to work with 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);