关于PHP cURL 的用法

之前有个接口一直返回错误信息 28 找了一圈没找到 郁闷了好久

最后把参数什么全部抓来 debug 了一番 发现是 使用 curl 请求一个外部接口的时候报错了 方法里只返回了 curl 对应的错误号 没有返回错误提示信息 所以就只返回了一个 28 数字

所以以后还是把错误号 和 错误提示信息都一并返回才对 到这里问题是解决了 顺便讲下 Curl


科普

cURL 是一个计算机软件项目,提供了一个库和命令行工具,用于使用各种协议传输数据。

cURL 项目生成两个产品 libcurlcURL

它于1997年首次发布。

该名称代表 Client URL (客户端URL)

libcurl

libcurl是一个免费的客户端URL传输库,[6]支持cookie,DICT,FTP,FTPS,Gopher,HTTP(支持HTTP / 2),HTTP POST,HTTP PUT,HTTP代理隧道,HTTPS,IMAP,Kerberos,LDAP,POP3,RTSP,SCP和SMTP。该库支持文件URI方案,SFTP,Telnet,TFTP,文件传输恢复,FTP上传,基于HTTP表单的上传,HTTPS证书,LDAPS,代理和用户加密码验证

cURL

cURL是一个使用URL语法获取或发送文件的命令行工具。

由于cURL使用libcurl,它支持一系列常见的Internet协议,目前包括HTTP,HTTPS,FTP,FTPS,SCP,SFTP,TFTP,LDAP,DAP,DICT,TELNET,FILE,IMAP,POP3,SMTP和RTSP(最后一个)仅在7.20.0或2010年2月9日之前的版本中有四个版本。

命令行下的简单使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
发送 get 请求
curl https://local.test.com/gateway/main.do?parame1=xx1&parame2=xx2
发送 post 请求
curl -X POST --data "parame1=xx1" https://local.test.com/gateway/main.do
指定发送json格式数据
curl -H "Content-Type:application/json" -X POST -d '{"access_token":"xx"}' https://local.test.com/gateway/main.do
指定referer
curl --referer http://www.before.com https://local.test.com/gateway/main.do
指定user-agent
curl --user-agent "[User Agent]" https://local.test.com/gateway/main.do

大概我常用的就这么几个了 具体的用法请自行 https://www.google.com

PHP 里的 cUrl

PHP 里有 libcurl 库

能够连接通讯各种服务器、使用各种协议。libcurl 目前支持的协议有 http、https、ftp、gopher、telnet、dict、file、ldap。 libcurl 同时支持 HTTPS 证书、HTTP POST、HTTP PUT、 FTP 上传(也能通过 PHP 的 FTP 扩展完成)、HTTP 基于表单的上传、代理、cookies、用户名+密码的认证。

下面写一个我常用的 curl 方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
function curlPost($url, $data, $needJson = 1, $timeout = 30)
{
$ch = curl_init();
//各种header设置自己在这里补充添加
$header = [
"Accept-Charset: utf-8",
//"Accept-Encoding: gzip, deflate",
//"Cache-Control: no-cache",
//"Mozilla/5.0 (compatible; MSIE 5.01; Windows NT 5.0)",
];
if ($needJson == 1) {
//如果是json格式的数据需要指定content-type
$data = json_encode($data);
$header = [
"Content-Length:".strlen($data),
"Content-type: application/json;charset='utf-8'",
];
}
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($ch, CURLOPT_TIMEOUT, $timeout); //设置cURL允许执行的最长秒数
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; MSIE 5.01; Windows NT 5.0)');
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_AUTOREFERER, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
//获取执行结果
$result = curl_exec($ch);
//获取错误号
$errorNo = curl_errno($ch);
//获取错误信息
$errorMsg = curl_error($ch);
//关闭资源
curl_close($ch);
if ($errorNo) {
return json_encode(['status' => false, 'msg' => $errorNo.':'.$errorMsg]);
} else {
return $result;
}
}
function curlGet($url, $timeout = 5)
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_TIMEOUT, $timeout); //设置cURL允许执行的最长秒数
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
$result = curl_exec($ch);
$errorNo = curl_errno($ch);
$errorMsg = curl_error($ch);
curl_close($ch);
if ($errorNo) {
return json_encode(['status' => false, 'msg' => $errorNo.':'.$errorMsg]);
} else {
return $result;
}
}

php cURL 错误码说明

下面是不完整的 curl 返回错误码 完整的请看

http://php.net/manual/en/function.curl-errno.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[1] => 'CURLE_UNSUPPORTED_PROTOCOL',
[2] => 'CURLE_FAILED_INIT',
[3] => 'CURLE_URL_MALFORMAT',
[4] => 'CURLE_URL_MALFORMAT_USER',
[5] => 'CURLE_COULDNT_RESOLVE_PROXY',
[6] => 'CURLE_COULDNT_RESOLVE_HOST',
[7] => 'CURLE_COULDNT_CONNECT',
[8] => 'CURLE_FTP_WEIRD_SERVER_REPLY',
[9] => 'CURLE_REMOTE_ACCESS_DENIED',
[11] => 'CURLE_FTP_WEIRD_PASS_REPLY',
[13] => 'CURLE_FTP_WEIRD_PASV_REPLY',
[14]=>'CURLE_FTP_WEIRD_227_FORMAT',
[15] => 'CURLE_FTP_CANT_GET_HOST',
[17] => 'CURLE_FTP_COULDNT_SET_TYPE',
[18] => 'CURLE_PARTIAL_FILE',
[19] => 'CURLE_FTP_COULDNT_RETR_FILE',
[21] => 'CURLE_QUOTE_ERROR',
[22] => 'CURLE_HTTP_RETURNED_ERROR',
[23] => 'CURLE_WRITE_ERROR',
[25] => 'CURLE_UPLOAD_FAILED',
[26] => 'CURLE_READ_ERROR',
[27] => 'CURLE_OUT_OF_MEMORY',
[28] => 'CURLE_OPERATION_TIMEDOUT',
[30] => 'CURLE_FTP_PORT_FAILED',

所以我遇见的 返回28 其实是请求超时了!!!


-------------The End-------------