使用 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 传输。