第一种编辑PHP.INI文件,打开OPENSSL支持选项
用文本编辑器打开php.ini文件,extension=php_openssl.dll去掉前面的分号,allow_url_include = off改为allow_url_include = On,然后重启服务就可以了。如图
第二种跳过https验证,在国内比较少见,我也是偶然的机会在国外网站发现了,参考:https://stackoverflow.com/questions/26148701/file-get-contents-ssl-operation-failed-with-code-1-and-more
文中代码是这样的:
|
1
2
3
4
5
6
7
8
9
10
11
|
<?php
$arrContextOptions=array(
“ssl”=>array(
“verify_peer”=>false,
“verify_peer_name”=>false,
),
);
$response=file_get_contents(“https://maps.co.weber.ut.us/arcgis/rest/services/SDE_composite_locator/GeocodeServer/findAddressCandidates?Street=&SingleLine=3042+N+1050+W&outFields=*&outSR=102100&searchExtent=&f=json”, false, stream_context_create($arrContextOptions));
echo$response; ?>
|
关键代码就是这行: “ssl”=>array
第三种 下载https证书到服务器
服务器 下载这个证书,http://curl.haxx.se/ca/cacert.pem
php.ini 配置
openssl.cafile = “/etc/ssl/certs/cacert.pem”//你实际下载证书的路径
重启 php 即可
第四种解决方法:
使用cURL 函数处理 https 的参数,获取文件内容
<?php
function getSSLPage($url) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_SSLVERSION,3);
$result = curl_exec($ch);
curl_close($ch);
return $result;
}
var_dump(getSSLPage("https://xxx.xxx.xxx"));
?>
第五种方法,如果你使用Snoopy.php
可以设置Snoopy参数
Snoopy提供了一些参数可供设置,来支持HTTPS协议。您可以通过设置以下参数来实现:
$snoopy = new Snoopy; $snoopy->curl_path ='/usr/bin/curl';//设置curl路径 $snoopy->curl_ssl_verify_host = false;//禁用SSL主机验证 $snoopy->curl_ssl_verify_peer = false;//禁用SSL对等验证 $snoopy->agent ="Mozilla/4.0(compatible; MSIE 6.0; Windows NT 5.1)";//设置浏览器代理
第六种解决方案:使用第三方库php-curl-class
php-curl-class是一个非常流行的PHP类库,它提供了一些强大的方法来支持HTTP和HTTPS协议。通过使用php-curl-class,您可以轻松地解决Snoopy无法抓取HTTPS网站的问题。
<?php require_once 'vendor/autoload.php'; use \Curl\Curl; $curl = new Curl(); $curl->get(''); echo $curl->response; ?>
第七种解决方案:使用第三方库Guzzle
Guzzle是一个非常流行的PHP HTTP客户端,它提供了一些强大的方法来支持HTTP和HTTPS协议。通过使用Guzzle,您可以轻松地解决Snoopy无法抓取HTTPS网站的问题。
<?php require 'vendor/autoload.php'; use GuzzleHttp\Client; $client = new Client(); $res =$client->request('GET',''); echo $res->getBody(); ?>
评论抢沙发