-
博文分类专栏
- Jquery基础教程
-
- 文章:(15)篇
- 阅读:46549
- shell命令
-
- 文章:(42)篇
- 阅读:154227
- Git教程
-
- 文章:(36)篇
- 阅读:234843
- leetCode刷题
-
- 文章:(76)篇
- 阅读:131787
-
PHP中curl扩展的使用详解2017-12-24 17:08 阅读(8416) 评论(0)
在上一篇文章“使用phpize为PHP添加curl扩展”中,安装了curl扩展,但是并没有说PHP中如何使用curl扩展,curl扩展主要用于发出网络请求、提取数据。本文中,主要探索在PHP中如何使用curl扩展,如果对curl命令感兴趣,可以参考“linux下curl命令汇总”。
首先,来一个简单的例子,如下:
<?php //1.创建一个curl资源 $ch = curl_init(); //2.设置参数 curl_setopt($ch, CURLOPT_URL, "http://www.findme.wang"); //设置url curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //设置结果保存到字符串中还是输出到屏幕上 //3.执行请求,抓取数据 $data = curl_exec($ch); //4.关闭cURL资源,并且释放系统资源 curl_close($ch); //5.对获取的数据,进行一定的操作 var_dump(strlen($data));
上面案例,可以看出,使用PHP的curl扩展主要分为五步,重点是在第二步参数的设置。下面我们来看看汇总一下常用的参数设置。
一、获取请求头和响应头
1.获取请求头
php的curl扩展要想获取请求头,需要设置CURLINFO_HEADER_OUT参数,如下:
curl_setopt($ch, CURLINFO_HEADER_OUT, TRUE); //CURLINFO_HEADER_OUT选项为ture时可以拿到请求头信息
设置过CURLINFO_HEADER_OUT参数后,怎样拿到请求头呢?
这个时候,通过curl_getinfo函数就可以拿到请求头,有如下两种方式获取请求的header:
//方式一 $info = curl_getinfo($ch); var_dump($info['request_header']); //输出请求头 //方式二 $requestHeader = curl_getinfo($ch, CURLINFO_HEADER_OUT); var_dump($requestHeader); //输出请求头
2.获取响应头
php的curl扩展要在发送请求的时候,一般只会返回响应内容,没有响应头,要想获取相应头,首先得设置CURLOPT_HEADER参数,如下:
curl_setopt($ch, CURLOPT_HEADER, true); //CURLOPT_HEADER选项为ture时可以返回响应头
此时,我们虽然可以拿到了响应头,只是响应头跟响应内容交杂在一起,如下:
如何,仅仅提取出响应头呢?
通过PHP的curl扩展,我们有两种方法:
方法二、限制不返回响应主体即可。
通过CURLOPT_NOBODY参考,我们可以限制此时,仅仅返回响应头,其实,是将请求方法变为了 HEAD,如下:
curl_setopt($ch, CURLOPT_NOBODY, true);
方法二、从包含响应头和响应主体的字符中截取出响应头
我们先通过curl_getinfo方法获取响应头的长度,如下:
$headerSize = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
然后进行字符串截取操作
$resHeader = substr($data, 0, $headerSize);
完整的程序如下:
//1.创建一个curl资源 $ch = curl_init(); //2.设置参数 curl_setopt($ch, CURLOPT_URL, "http://www.findme.wang"); //设置url curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //设置结果保存到字符串中还是输出到屏幕上 curl_setopt($ch, CURLOPT_HEADER, true); //CURLOPT_HEADER选项为ture时可以返回响应头 curl_setopt($ch, CURLINFO_HEADER_OUT, true); //CURLINFO_HEADER_OUT选项为ture时可以拿到请求头信息 curl_setopt($ch, CURLOPT_NOBODY, true); //3.执行请求,抓取数据 $data = curl_exec($ch); $headerSize = curl_getinfo($ch, CURLINFO_HEADER_SIZE); $requestHeader = curl_getinfo($ch, CURLINFO_HEADER_OUT); //4.关闭cURL资源,并且释放系统资源 curl_close($ch); //5.对获取的数据,进行一定的操作 $resHeader = substr($data, 0, $headerSize); var_dump($requestHeader); var_dump($resHeader);
二、参数设置方式
使用curl_setopt函数进行设置,格式如下:
bool curl_setopt ( resource $ch , int $option , mixed $value )
其中,参数:
ch
由 curl_init() 返回的 cURL 句柄。
option
需要设置的CURLOPT_XXX选项,因为curl参数选项都是以CURLOPT开头。
value
将设置在option选项上的值。
三、常用的参数设置
1.设置请求url
curl通过CURLOPT_URL参数来设置curl,如下:
curl_setopt($ch, CURLOPT_URL, "http://www.findme.wang"); //设置url
2.get和post请求方法的设置
curl默认的执行get请求,当CURLOPT_POST参数值为true时,执行post请求。设置格式如下:
curl_setopt($ch , CURLOPT_POST , true)//设置post方法 curl_setopt($ch , CURLOPT_POST, false); //设置不用post方法,即用get方法
3.post和get请求参数设置
通过CURLOPT_POSTFIELDS参数,可以设置post方法请求参数,如下:
curl_setopt($ch, CURLOPT_POSTFIELDS, ['name' => 'dq']); //设置url
针对get方法,请求参数直接放到url里面。
备注:若不设置请求方法,直接设置CURLOPT_POSTFIELDS参数,请求方法会自动更换为post请求。如下:
//1.创建一个curl资源 $ch = curl_init(); //2.设置参数 curl_setopt($ch, CURLOPT_URL, "http://www.findme.wang"); //设置url curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //设置结果保存到字符串中还是输出到屏幕上 curl_setopt($ch, CURLOPT_POSTFIELDS, ['name' => 'dq']); //设置post请求参数 curl_setopt($ch, CURLINFO_HEADER_OUT, TRUE); //CURLINFO_HEADER_OUT选项为ture时可以拿到请求头信息 //3.执行请求,抓取数据 $data = curl_exec($ch); $info = curl_getinfo($ch); //4.关闭cURL资源,并且释放系统资源 curl_close($ch); //5.对获取的数据,进行一定的操作 var_dump($info['request_header']); //输出请求头
4.设置referer
通过CURLOPT_REFERER选项,可以为curl添加refer,如下:
curl_setopt($ch, CURLOPT_REFERER, 'http://www.findme.wang/navigate/index.html');
5.指定客户端的设备信息
通过CURLOPT_USERAGENT选项,可以为curl添加客户端设备信息,如下:
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36");
6.指定cookie
通过CURLOPT_COOKIE选项,可以为curl添加cookie,如下:
curl_setopt($ch, CURLOPT_COOKIE, 'name=dqs;age=18'); //设置cookie
7.设置相应超时时间
php中的curl提供了CURLOPT_TIMEOUT、CURLOPT_TIMEOUT_MS两个参数来设置curl响应设置,分别如下;
curl_setopt($ch, CURLOPT_TIMEOUT, 60); //设置程序运行最长时间为60秒 curl_setopt($ch, CURLOPT_TIMEOUT_MS, 60); //设置程序运行最长时间为60毫秒
8.设置header
php的curl还提供了CURLOPT_HTTPHEADER来设置header头信息,如下:
$headers = ["Host:www.findme.wang","referer:http://www.findme.wang/navigate/index.html"]; curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
在header中,设置了host,执行结果如下:
当然,还有很多其他的设置,就不一一说了,更多可以参考官方手册
四、获取报错信息
php中的curl提供了curl_errno和curl_error 函数来处理curl中错误信息。curl_errno返回最后一次 cURL 操作的错误代码,返回当前会话最后一次错误的字符串。常用的状态码如下:
$error_codes=array( [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', [31] => 'CURLE_FTP_COULDNT_USE_REST', [33] => 'CURLE_RANGE_ERROR', [34] => 'CURLE_HTTP_POST_ERROR', [35] => 'CURLE_SSL_CONNECT_ERROR', [36] => 'CURLE_BAD_DOWNLOAD_RESUME', [37] => 'CURLE_FILE_COULDNT_READ_FILE', [38] => 'CURLE_LDAP_CANNOT_BIND', [39] => 'CURLE_LDAP_SEARCH_FAILED', [41] => 'CURLE_FUNCTION_NOT_FOUND', [42] => 'CURLE_ABORTED_BY_CALLBACK', [43] => 'CURLE_BAD_FUNCTION_ARGUMENT', [45] => 'CURLE_INTERFACE_FAILED', [47] => 'CURLE_TOO_MANY_REDIRECTS', [48] => 'CURLE_UNKNOWN_TELNET_OPTION', [49] => 'CURLE_TELNET_OPTION_SYNTAX', [51] => 'CURLE_PEER_FAILED_VERIFICATION', [52] => 'CURLE_GOT_NOTHING', [53] => 'CURLE_SSL_ENGINE_NOTFOUND', [54] => 'CURLE_SSL_ENGINE_SETFAILED', [55] => 'CURLE_SEND_ERROR', [56] => 'CURLE_RECV_ERROR', [58] => 'CURLE_SSL_CERTPROBLEM', [59] => 'CURLE_SSL_CIPHER', [60] => 'CURLE_SSL_CACERT', [61] => 'CURLE_BAD_CONTENT_ENCODING', [62] => 'CURLE_LDAP_INVALID_URL', [63] => 'CURLE_FILESIZE_EXCEEDED', [64] => 'CURLE_USE_SSL_FAILED', [65] => 'CURLE_SEND_FAIL_REWIND', [66] => 'CURLE_SSL_ENGINE_INITFAILED', [67] => 'CURLE_LOGIN_DENIED', [68] => 'CURLE_TFTP_NOTFOUND', [69] => 'CURLE_TFTP_PERM', [70] => 'CURLE_REMOTE_DISK_FULL', [71] => 'CURLE_TFTP_ILLEGAL', [72] => 'CURLE_TFTP_UNKNOWNID', [73] => 'CURLE_REMOTE_FILE_EXISTS', [74] => 'CURLE_TFTP_NOSUCHUSER', [75] => 'CURLE_CONV_FAILED', [76] => 'CURLE_CONV_REQD', [77] => 'CURLE_SSL_CACERT_BADFILE', [78] => 'CURLE_REMOTE_FILE_NOT_FOUND', [79] => 'CURLE_SSH', [80] => 'CURLE_SSL_SHUTDOWN_FAILED', [81] => 'CURLE_AGAIN', [82] => 'CURLE_SSL_CRL_BADFILE', [83] => 'CURLE_SSL_ISSUER_ERROR', [84] => 'CURLE_FTP_PRET_FAILED', [84] => 'CURLE_FTP_PRET_FAILED', [85] => 'CURLE_RTSP_CSEQ_ERROR', [86] => 'CURLE_RTSP_SESSION_ERROR', [87] => 'CURLE_FTP_BAD_FILE_LIST', [88] => 'CURLE_CHUNK_FAILED');