PHP - cURL使用详解(模拟浏览器请求)
1,cURL介绍
(1)cURL 使用 URL 的语法在服务端模拟浏览器来传输数据,支持多种协议:FTP、FTPS、HTTP、HTTPS、GOPHER, TELNET、DICT、FILE 以及 LDAP 等。
(2)cURL 具体能够实现的功能有:HTTPS 认证,HTTP POST 方法,HTTP PUT 方法,FTP 上传,keyberos 认证,HTTP 上传,代理服务器,cookies,用户名/密码认证,下载文件断点续传,上传文件断点续传,http 代理服务器管道,甚至它还支持 IPv6,scoket5 代理服务器,通过 http 代理服务器上传文件到 FTP 服务器等等。
2,cURL发送请求的基本流程

4,使用cURL发送POST请求(form-data的形式提交数据)
5,使用cURL发送POST请求(raw形式提交数据)
对上面的 POST 封装方法做个小修改,参数中的发送数据格式改成字符串。
6,获取cURL请求输出的相关信息

(1)cURL 使用 URL 的语法在服务端模拟浏览器来传输数据,支持多种协议:FTP、FTPS、HTTP、HTTPS、GOPHER, TELNET、DICT、FILE 以及 LDAP 等。
(2)cURL 具体能够实现的功能有:HTTPS 认证,HTTP POST 方法,HTTP PUT 方法,FTP 上传,keyberos 认证,HTTP 上传,代理服务器,cookies,用户名/密码认证,下载文件断点续传,上传文件断点续传,http 代理服务器管道,甚至它还支持 IPv6,scoket5 代理服务器,通过 http 代理服务器上传文件到 FTP 服务器等等。
2,cURL发送请求的基本流程
(1)初始化,创建一个新 cURL 资源
(2)设置 URL 和相应的选项
(3)执行并获取结果
(4)关闭 cURL 资源,并且释放系统资源
3,使用cURL发送GET请求
为方便使用我这里封装了一个 GET 请求方法,使用时可以设置 url 地址、参数、自定义 http heaeder、以及连接超时时间。
<?php /** *封装cURL的调用接口,get的请求方式。 */ function doCurlGetRequest($url, $data = [], $header = [], $timeout = 5){ if($url == "" || $timeout <= 0){ return false; } $url = $url.'?'.http_build_query($data); $curl = curl_init((string)$url); curl_setopt($curl, CURLOPT_HEADER, false); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); // 信任任何证书 curl_setopt($curl, CURLOPT_RETURNTRANSFER,true); curl_setopt($curl, CURLOPT_TIMEOUT, (int)$timeout); curl_setopt($curl, CURLOPT_HTTPHEADER, $header); //添加自定义的http header return curl_exec($curl); } ?>使用样例:
<?php $url = "https://a.wunderlist.com/api/v1/tasks"; $data = array('list_id'=>'2669071'); $header[] = "X-Client-ID:7e43c50781295f355"; $header[] = "X-Access-Token:4dc049e83308fe6c66ee08a1833577f90298bcec3dca66cc1d20"; echo doCurlGetRequest($url, $data, $header); ?>执行结果:

4,使用cURL发送POST请求(form-data的形式提交数据)
同样地我这里封装了一个 POST 请求方法,使用时可以设置 url 地址、参数、自定义 http heaeder、以及连接超时时间。
使用样例:
<?php /** **封装cURL的调用接口,post的请求方式。 **/ function doCurlPostRequest($url, $data = [], $header = [], $timeout = 5){ if($url == '' || $timeout <=0){ return false; } $curl = curl_init((string)$url); curl_setopt($curl, CURLOPT_HEADER, false); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); // 信任任何证书 curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($data)); curl_setopt($curl, CURLOPT_POST,true); curl_setopt($curl, CURLOPT_RETURNTRANSFER,true); curl_setopt($curl, CURLOPT_TIMEOUT,(int)$timeout); curl_setopt($curl, CURLOPT_HTTPHEADER, $header); //添加自定义的http header return curl_exec($curl); } ?>
<?php $url = "http://www.hangge.com/post.php"; $data = array('list_id'=>'2669071', 'user_id'=>'123456'); $header[] = "X-Client-ID:7e43c50781295f35"; $header[] = "X-Access-Token:4dc049e83308fe6c66ee08a1833577f90298bcec3dca66cc1d202"; echo doCurlPostRequest($url, $data, $header); ?>post.php 中接收参数相关代码:
<?php echo $_POST["list_id"]; echo $_POST["user_id"]; ?>
5,使用cURL发送POST请求(raw形式提交数据)
对上面的 POST 封装方法做个小修改,参数中的发送数据格式改成字符串。
<?php /** **封装cURL的调用接口,post的请求方式。 **/ function doCurlPostRequest($url, $requestString = "", $header = [], $timeout = 5){ if($url == '' || $timeout <=0){ return false; } $curl = curl_init((string)$url); curl_setopt($curl, CURLOPT_HEADER, false); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); // 信任任何证书 curl_setopt($curl, CURLOPT_POSTFIELDS, $requestString); curl_setopt($curl, CURLOPT_POST,true); curl_setopt($curl, CURLOPT_RETURNTRANSFER,true); curl_setopt($curl, CURLOPT_TIMEOUT,(int)$timeout); curl_setopt($curl, CURLOPT_HTTPHEADER, $header); //添加自定义的http header return curl_exec($curl); } ?>使用样例,这里以 raw 数据的形式提交一个 json 串:
<?php $url = "http://www.hangge.com/post.php"; $data = '{ "list_id": 2669071, "title": "hangge.com" }'; $header[] = "X-Client-ID:7e43c50781295f35"; $header[] = "X-Access-Token:4dc049e83308fe6c66ee08a1833577f90298bcec3dca66cc1d20"; $header[] = "Content-Type: application/json"; //数据是raw形式的json格式数据 echo doCurlPostRequest($url, $data, $header); ?>post.php 中这么接收数据:
<?php echo file_get_contents("php://input"); ?>
前面的样例中,我们执行完 curl_exec() 函数后就把服务器返回的信息打印出来。其实在 curl_exec() 执行后还可以使用 curl_getinfo() 函数获取 CURL 请求输出的相关信息。
比如这里对前面 GET 请求样例做个修改,返回请求信息。将请求 url、请求时间给打印出来。
<?php /** *封装cURL的调用接口,get的请求方式。 */ function doCurlGetRequest($url, $data = [], $header = [], $timeout = 5){ if($url == "" || $timeout <= 0){ return false; } $url = $url.'?'.http_build_query($data); $curl = curl_init((string)$url); curl_setopt($curl, CURLOPT_HEADER, false); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); // 信任任何证书 curl_setopt($curl, CURLOPT_RETURNTRANSFER,true); curl_setopt($curl, CURLOPT_TIMEOUT, (int)$timeout); curl_setopt($curl, CURLOPT_HTTPHEADER, $header); //添加自定义的http header curl_exec($curl); return curl_getinfo($curl); } $url = "https://a.wunderlist.com/api/v1/tasks"; $data = array('list_id'=>'267128407'); $header[] = "X-Client-ID:7e43c50781295f3"; $header[] = "X-Access-Token:4dc049e83308fe6c66ee08a1833577f90298bcec3dca66cc1d20"; $info = doCurlGetRequest($url, $data, $header); echo ' URL:'.$info['url'].'<br>耗时:'.$info['total_time'].'秒'; ?>执行结果:

当然 curl_getinfo() 返回的数据不只有这两个,完整的数据如下:
url:网络地址。
content_type:内容编码。
http_code:HTTP状态码。
header_size:header的大小。
request_size:请求的大小。
filetime:文件创建的时间。
ssl_verify_result:SSL验证结果。
redirect_count:跳转计数。
total_time:总耗时。
namelookup_time:DNS查询耗时。
connect_time:等待连接耗时。
pretransfer_time:传输前准备耗时。
size_uplpad:上传数据的大小。
size_download:下载数据的大小。
speed_download:下载速度。
speed_upload:上传速度。
download_content_length:下载内容的长度。
upload_content_length:上传内容的长度。
starttransfer_time:开始传输的时间表。
redirect_time:重定向耗时。
content_type:内容编码。
http_code:HTTP状态码。
header_size:header的大小。
request_size:请求的大小。
filetime:文件创建的时间。
ssl_verify_result:SSL验证结果。
redirect_count:跳转计数。
total_time:总耗时。
namelookup_time:DNS查询耗时。
connect_time:等待连接耗时。
pretransfer_time:传输前准备耗时。
size_uplpad:上传数据的大小。
size_download:下载数据的大小。
speed_download:下载速度。
speed_upload:上传速度。
download_content_length:下载内容的长度。
upload_content_length:上传内容的长度。
starttransfer_time:开始传输的时间表。
redirect_time:重定向耗时。