王新阳

wangxinyang

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;
		}
	}
}
2015-12-30
2025-04-05 星期六 农历三月初八