这篇文章主要介绍了php之curl实现http与https请求的方法,分别讲述了PHP访问http网页与访问https网页的实例,以及相关的注意事项,需要的朋友可以参考下。
本文实例讲述了php之curl实现http与https请求的方法,分享给大家供大家参考。具体如下:
通常来说,php的curl函数组可以帮助我们把机器伪装成人的行为来抓取网站,下面来分享两个例子,一个是访问http网页,一个访问https网页,一起来看一下。
每次要使用curl的时候,总要查一堆资料。
现在将常用的几句保存下来,省的每次都去谷歌。
常规curl请求:
$url = 'http://www.jb51.net';
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_HEADER, 1);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$data = curl_exec($curl);
curl_close($curl);
var_dump($data);
使用curl请求HTTPS:
$url = 'https://www.jb51.net';
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_HEADER, 1);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
// 设置头信息(当用IP直接访问时,加这个如:https://baibu.com -> 220.15.23.5)
// curl_setopt($ci, CURLOPT_HTTPHEADER, array('Host:baibu.com'));
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); //这个是重点,规避ssl的证书检查。
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE); // 跳过host验证
$data = curl_exec($curl);
curl_close($curl);
var_dump($data);
注意
当请求https的数据时,会要求证书,这时候,加上下面这两个参数,规避ssl的证书检查
复制代码 代码如下:
// https请求 不验证证书和hosts
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
// 从证书中检查SSL加密算法是否存在(默认不需要验证)
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl https请求代码
<?php
/** curl 获取 https 请求
* @param String $url 请求的url
* @param Array $data 要發送的數據
* @param Array $header 请求时发送的header
* @param int $timeout 超时时间,默认30s
* @param bool $debug 是否打印错误信息,默认false
*/
function curl_https($url, $data=array(), $header=array(), $timeout=30, $debug=false){
$ch = curl_init();
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 跳过证书检查
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); // 从证书中检查SSL加密算法是否存在
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
$response = curl_exec($ch);
if($error=curl_error($ch)){
die($error);
}
// 打印错误信息
if($debug)
{
echo '=====info====='."\r\n";
print_r( curl_getinfo($ch) );
echo '=====error====='."\r\n";
print_r( curl_error($ch) );
echo '=====$response====='."\r\n";
print_r( $response );
}
curl_close($ch);
return $response;
}
// 调用
$url = 'https://www.example.com/api/message.php';
$data = array('name'=>'fdipzone');
$header = array();
$response = curl_https($url, $data, $header, 5);
echo $response;
?>
baidu域名解析后https请求示例
为什么要解析域名后再请求呢?因为用curl请求网络,如果直接用域名baidu.com 这样会在请求中解析域名耗时很长,测试了几次有10几秒吧,如果直接用解析后的IP请求,则速度会大大提升。
请看下面的示例:
// $url = "https://www.baidu.com";
$url = "https://123.125.114.144";
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_HEADER, 1);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
// 增加请求头文件
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Host:baidu.com'));
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);//这个是重点。
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
$data = curl_exec($curl);
// 打印获取curl请求信息
// $curl_info = curl_getinfo( $curl );
// print_r($curl_info);
// 打印错误信息
// curl_error( $curl);
curl_close($curl);
var_dump($data);