使用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
我这样做了,我还有问题......
还有什么呢?
解决了
要解决此错误,您需要在Web服务器上安装PHP的OpenSSL
软件包。
在FreeBSD服务器上,您可能需要安装以下软件包:php53_openssl
并重新启动您的Web服务器。
在Windows服务器上,打开php.ini
配置文件,然后取消注释以下行:
;extension=php_openssl
并重新启动Web服务器。应该解决错误。
参考:我从this link那里得到它,这对我有用..所以很有信心。
对于Windows 64bit上的PHP 7,请务必将libcrypto-1_1-x64.dll
放入环境变量路径。例如:C:\php\libcrypto-1_1-x64.dll;
我有同样的问题。我试图访问Facebook图表。它并不是因为它无法访问URL,而是因为我没有传递参数而导致Facebook返回400错误。尝试在具有有效HTTPS连接的站点上连接到HTTPS。例如。试试这个:
file_get_contents("https://www.namhost.com");
如果可行,您必须了解为什么要连接的HTTPs连接失败,因为问题不在于您无法连接到HTTP,而是您连接的内容不喜欢请求。
就像人们说的那样,检查一下配置。
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');
我只是想添加这个花絮,因为我在这个问题上挣扎了几个小时,最后想出了一些有用的东西。对于很多这些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设置为“On”。
如果这些行已注释,请取消注释它们。
此外,您可以使用以下脚本进行诊断:(取自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);