【问题标题】:Unable to find the wrapper "https" with file_get_contents无法使用 file_get_contents 找到包装器“https”
【发布时间】:2013-09-09 17:10:25
【问题描述】:

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

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

还能是什么?

【问题讨论】:

  • 我们可能需要更多信息来帮助您...我假设您在尝试加载 .dll 时运行 Windows?你能尝试运行phpinfo() 并寻找一行写着:OpenSSL support enabled 吗?应该在标题“openssl”下。
  • 您要连接到哪个 URl?你能打开namhost.com吗?我刚刚在尝试连接到 Facebook URL 时发现它吐出 400 错误,因为参数不正确,结果是我的 IP 地址在设置中设置不正确。 IE。我可以访问 HTTPS 链接,但不能访问 facebook。
  • 请参阅stackoverflow.com/questions/5444249/… 以获得体面的答案。仔细阅读答案并在适当的php.ini 中启用扩展。不要忘记重新启动 Apache。
  • 能否运行php -i (cli) 或phpinfo() (web) 来查看扩展是否真正启用?如果您不知道如何查看它是否已启用,请发布结果。

标签: php apache https file-get-contents


【解决方案1】:

已解决

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

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

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

 ;extension=php_openssl

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

参考:我是从 this link 那里学到的,它对我有用.. 所以归功于他。

【讨论】:

  • @RanjithAlappadan,您的意思是取消注释吗?那么行首的字符; 将对该行进行注释。删除它会使其取消注释(意味着可解析)
  • 这不适用于较新版本的 PHP。对应的配置行已更改。我在这里发布了针对当前版本的解决方案的答案。
【解决方案2】:

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

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

extension_dir = "ext"
extension=openssl

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 更新到 x64 php 后从未想过更新我的 PATH。谢谢朋友。
    • 如果您使用 WAMP 并安装了不同的 PHP7+ 版本,您需要手动将 PATH 环境变量更新为您在 WAMP 中使用的版本。谢谢@Артем
    【解决方案4】:

    我只是想添加这个花絮,因为我在这个问题上苦苦挣扎了几个小时,终于找到了可行的方法。对于许多此类 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】:

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

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

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

      【讨论】:

        【解决方案6】:

        正如人们所说,检查配置。

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

        【讨论】:

          【解决方案7】:

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

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

          如果它有效,您必须看到为什么要连接的HTTPS连接失败,因为问题不是您无法连接到HTTPS,而是您连接的内容并不喜欢请求.

          【讨论】:

            【解决方案8】:

            对我来说,这个问题是由于在 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 传输。

            【讨论】:

              猜你喜欢
              • 2020-12-05
              • 2012-12-10
              • 2013-09-23
              • 2015-05-25
              • 2012-09-16
              • 2017-06-07
              • 2020-12-30
              • 2016-08-25
              • 1970-01-01
              相关资源
              最近更新 更多