分享自己工作中总结积累的curl函数,废话不多说,直接上干货。
1.发起http请求的curl函数,post和get都ok。
/**
* 发送curl请求
* @param $url 'https://www.wenlin.com/'
* @param bool $is_post true
* @param array $data ['email' => 'xxx@xxx.com', 'password' => 'xxx']
* @param array $header ['Content-Type:application/x-www-form-urlencoded', 'X-Requested-With:XMLHttpRequest']
* @param bool $ssl false
* @param bool $is_json false
* @param int $time_out 0
* @return array
* @Author: 夜雨闻铃
*/
function http_curl($url, $is_post = true, $data = [], $header = [], $ssl = false, $is_json = false, $time_out = 0)
{
$curl = curl_init();
// 设置url
curl_setopt($curl, CURLOPT_URL, $url);
//json处理
if ($is_json && $data) {
$data = json_encode($data);
$header = array_merge($header, ['Content-Type: application/json']);
}
// 将头文件的信息作为数据流输出
curl_setopt($curl, CURLOPT_HEADER, false);
// 请求结果以字符串返回,不直接输出
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
// 禁止 cURL 验证对等证书
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
// 设置头信息
curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
//identity", "deflate", "gzip“,三种编码方式,如果设置为空字符串,则表示支持三种编码方式。当出现乱码时,可设置此字符串
curl_setopt($curl, CURLOPT_ENCODING, '');
//设置http版本。HTTP1.1是主流的http版本
curl_setopt($curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
//如果curl版本,大于7.28.1,得是2才行,7.0版本的php自带的curl版本为7.40.1.使用php7以上的,就能确保没问题
$ssl = $ssl ? 2 : 0;
// 检查服务器SSL证书中是否存在一个公用名
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, $ssl);
//连接对方主机时的最长等待时间。设置为10秒时,如果对方服务器10秒内没有响应,则主动断开链接。为0则,不限制服务器响应时间
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, $time_out);
//CURLOPT_TIMEOUT:整个cURL函数执行过程的最长等待时间,也就是说,这个时间是包含连接等待时间的
curl_setopt($curl, CURLOPT_TIMEOUT, 0);
if ($is_post) {
// 设置POST请求
curl_setopt($curl, CURLOPT_POST, true);
// 构建参数
if ($is_json) {
//如果是json字符串的方式,不能用http_build_query函数
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
} else {
//如果是数组的方式,要加http_build_query,不加的话,遇到二维数组会报错。
curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($data));
}
} else {
// GET
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'GET');
}
// 执行请求
$response = curl_exec($curl);
$content_type = curl_getinfo($curl, CURLINFO_CONTENT_TYPE);//返回的CONTENT_TYPE类型
$http_code = curl_getinfo($curl, CURLINFO_HTTP_CODE);//返回的http状态码
if (curl_errno($curl)) {
$result = [
'HTTP_MSG' => curl_error($curl),
'HTTP_BODY' => null,
'HTTP_HEADER' => $content_type,
'HTTP_CODE' => $http_code,
];
} else {
$result = [
'HTTP_MSG' => 'SUCCESS',
'HTTP_BODY' => json_decode($response, true),
'HTTP_HEADER' => $content_type,
'HTTP_CODE' => $http_code,
];
}
curl_close($curl);
return $result;
}
2.用curl拉取文件,用get的方式拉取文件。 url等于 http://13.70.0.51:8080/static/balance.csv这种类型的。用get形式请求。
function getFileCurlTwo($url)
{
//设置Header头
$header[] = "Accept: application/json";
$header[] = "Accept-Encoding: gzip";
//添加HTTP header头采用压缩和GET方式请求
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_SSLVERSION, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt( $ch, CURLOPT_HTTPHEADER, $header );
curl_setopt($ch,CURLOPT_ENCODING , "gzip");
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
$res = curl_exec($ch);
curl_close($ch);
return $res;
}
3.文件拉取用curl,用post请求,data主要是带签名,提供安全性
function getFileCurl($url,$data = [])
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_SSLVERSION, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
$res = curl_exec($ch);
curl_close($ch);
return $res;
}
例子,帮助大家理解一下
public function getMt5File()
{
//先判断文件所时候已经拉取
$file_name = "./static/file/static_bonus_cloud_" . date('Ymd', time()) . ".csv";
if (file_exists($file_name)) {
die('文件已存在');
}
//私钥
$private_key = config('scan_private_key');
$find_url = config('scan_url') . '/api/adjusted_bonus';
$data = array(
'type' => 1,
'bonus_date' => date('Y-m-d'),
'timestamp' => time(),
);
//加密生成签名
$sign = encryption($data, $private_key);
$data['sign'] = $sign;
//先查询文件是否生成
$find_res = getFileCurl($find_url, $data);
if ($find_res) {
$find_res = json_decode($find_res, true);
if ($find_res['code'] == 200 & $find_res['data']['is_grant'] == 1) {
//文件拉取
$file_url = config('scan_url') . '/api/get_csv';
$file_res = getFileCurl($file_url, $data);
//将文件,保存到对应的位置
file_put_contents($file_name, $file_res);
}
}
}
后面还会继续分享自己总结积累的心得体会。可以关注我一波,有干货时马上收到通知。如需转载此原创文章,注明一下我这个原作者即可。