PHP curl示例
cur进行https请求时,如果出现 curl: (35) SSL connect error
一般是发起请求的服务器ssl_version为 NSS 需要改为 openSSL
/**
* 通过curl请求远程数据
* @param string $url
* @param string $request_method 默认GET
* @param array $post_data 默认null
* @param string $do_what http_build_query(发送多组数组时必须使用此项)/json_encode
* @param array $option_array 批量设置特殊选项
* @param bool return_with_curlinfo 是否返回curlinfo信息
* 用下面的方式批量设置curl选项(选项有多种类型,参考:https://www.php.net/manual/zh/function.curl-setopt )
* $option_array=array(
CURLOPT_HTTPHEADER=>array(
'Connection: keep-alive',
'Content-Type: application/json; charset=utf-8',
),
CURLOPT_TIMEOUT => 3,
);
* @return FALSE | string
*/
function my_curl($url, $request_method='GET', $post_data=NULL, $do_what='', $option_array=array(), $return_with_curlinfo=false){
is_url($url) OR $url=(is_https()?'https://':'http://').$_SERVER['HTTP_HOST'].$url;
is_array($option_array) OR $option_array=array();
if($post_data){
switch($do_what){
case 'json_encode': //需要发送json数据时,对数组或对象进行json编码(微信开发此处不能包含中文,否则会有:不合法的请求字符,不能包含\uxxxx格式的字符)
$post_data = json_encode($post_data);
$option_array[CURLOPT_HTTPHEADER][] = 'Content-length: '.strlen($post_data);
$option_array[CURLOPT_HTTPHEADER][] = 'Content-Type: application/json; charset=utf-8';
break;
case 'http_build_query':
$post_data = http_build_query($post_data); //对数组或对象使用http_build_query()以提高兼容性
$option_array[CURLOPT_HTTPHEADER][] = 'Content-length: '.strlen($post_data);
break;
default:
}
}
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); //curl_exec执行成功则返回结果(默认返回true),失败返回false
curl_setopt($ch, CURLOPT_HEADER, false); //启用时会将头文件的信息作为数据流输出
in_array(CURLOPT_CONNECTTIMEOUT, $option_array) OR curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5); //连接超时时间
in_array(CURLOPT_TIMEOUT, $option_array) OR curl_setopt($ch, CURLOPT_TIMEOUT, 30); //数据接收的最大时间
strtoupper($request_method)=='POST' AND curl_setopt($ch, CURLOPT_POST, true); //POST方式时添加
if(strpos(strtolower($url), 'https://')===0){
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); //https请求时跳过cURL验证对等证书
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); //https请求时跳过cURL验证域名
}
$post_data AND curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
count($option_array) AND curl_setopt_array($ch, $option_array);
$output = curl_exec($ch);
$outinfo = curl_getinfo($ch);
$err_no = curl_errno($ch);
$curl_error = $err_no ? 'curl: '.curl_error($ch)." $err_no" : ''; //失败时返回当前会话最后一次错误的字符串
curl_close($ch);
if($return_with_curlinfo){
if($err_no){
log_message('error', $err_no.', '.$curl_error);
return array('data'=>FALSE, 'info'=>$outinfo);
}else{
return array('data'=>$output, 'info'=>$outinfo);
}
}else{
if($err_no){
log_message('error', $err_no.', '.$curl_error);
return FALSE;
}else{
return $output;
}
}
}
