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; } } }