使用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
我这样做了,我还有问题......
还有什么呢?
答案 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);