<p>1,cURL介绍</p><p>(1)cURL 使用 URL 的语法在服务端模拟浏览器来传输数据,支持多种协议:FTP、FTPS、HTTP、HTTPS、GOPHER, TELNET、DICT、FILE 以及 LDAP 等。</p><p>(2)cURL 具体能够实现的功能有:HTTPS 认证,HTTP POST 方法,HTTP PUT 方法,FTP 上传,keyberos 认证,HTTP 上传,代理服务器,cookies,用户名/密码认证,下载文件断点续传,上传文件断点续传,http 代理服务器管道,甚至它还支持 IPv6,scoket5 代理服务器,通过 http 代理服务器上传文件到 FTP 服务器等等。</p><p>2,cURL发送请求的基本流程</p><p>(1)初始化,创建一个新 cURL 资源</p><p>(2)设置 URL 和相应的选项</p><p>(3)执行并获取结果</p><p>(4)关闭 cURL 资源,并且释放系统资源</p><p>3,使用cURL发送GET请求</p><p>为方便使用我这里封装了一个 GET 请求方法,使用时可以设置 url 地址、参数、自定义 http heaeder、以及连接超时时间。</p><pre class="brush:php;toolbar:false">
<?php
/**
*封装cURL的调用接口,get的请求方式。
*/
functiondoCurlGetRequest($url,$data=[],$header=[],$timeout=5){
if($url==""||$timeout<=0){
returnfalse;
}
$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);//添加自定义的httpheader
returncurl_exec($curl);
}
?></pre><p>使用样例:</p><pre class="brush:php;toolbar:false">
<?php
$url="https://a.wunderlist.com/api/v1/tasks";
$data=array('list_id'=>'2669071');
$header[]="X-Client-ID:7e43c50781295f355";
$header[]="X-Access-Token:4dc049e83308fe6c66ee08a1833577f90298bcec3dca66cc1d20";
echodoCurlGetRequest($url,$data,$header);
?></pre><p>执行结果:</p><p>原文:PHP - cURL使用详解(模拟浏览器请求)</p><p>4,使用cURL发送POST请求(form-data的形式提交数据)</p><p>同样地我这里封装了一个 POST 请求方法,使用时可以设置 url 地址、参数、自定义 http heaeder、以及连接超时时间。</p><pre class="brush:php;toolbar:false">
<?php
/**
**封装cURL的调用接口,post的请求方式。
**/
functiondoCurlPostRequest($url,$data=[],$header=[],$timeout=5){
if($url==''||$timeout<=0){
returnfalse;
}
$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);//添加自定义的httpheader
returncurl_exec($curl);
}
?></pre><p>使用样例:</p><pre class="brush:php;toolbar:false">
<?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";
echodoCurlPostRequest($url,$data,$header);
?></pre><p>post.php 中接收参数相关代码:</p><pre class="brush:php;toolbar:false">
<?php
echo$_POST["list_id"];
echo$_POST["user_id"];
?></pre><p>5,使用cURL发送POST请求(raw形式提交数据)</p><p>对上面的 POST 封装方法做个小修改,参数中的发送数据格式改成字符串。</p><pre class="brush:php;toolbar:false">
<?php
/**
**封装cURL的调用接口,post的请求方式。
**/
functiondoCurlPostRequest($url,$requestString="",$header=[],$timeout=5){
if($url==''||$timeout<=0){
returnfalse;
}
$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);//添加自定义的httpheader
returncurl_exec($curl);
}
?></pre><p>使用样例,这里以 raw 数据的形式提交一个 json 串:</p><pre class="brush:php;toolbar:false">
<?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格式数据
echodoCurlPostRequest($url,$data,$header);
?></pre><p>post.php 中这么接收数据:</p><pre class="brush:php;toolbar:false">
<?php
echofile_get_contents("php://input");
?></pre><p>6,获取cURL请求输出的相关信息</p><p>前面的样例中,我们执行完 curl_exec() 函数后就把服务器返回的信息打印出来。其实在 curl_exec() 执行后还可以使用 curl_getinfo() 函数获取 CURL 请求输出的相关信息。</p><p>比如这里对前面 GET 请求样例做个修改,返回请求信息。将请求 url、请求时间给打印出来。</p><pre class="brush:php;toolbar:false"><?php
/**
*封装cURL的调用接口,get的请求方式。
*/
functiondoCurlGetRequest($url,$data=[],$header=[],$timeout=5){
if($url==""||$timeout<=0){
returnfalse;
}
$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);//添加自定义的httpheader
curl_exec($curl);
returncurl_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'].'秒';
?></pre><p>执行结果:</p><p>原文:PHP - cURL使用详解(模拟浏览器请求)</p><p>当然 curl_getinfo() 返回的数据不只有这两个,完整的数据如下:</p><pre class="brush:php;toolbar:false">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:重定向耗时。</pre>