PHP - cURL使用详解(模拟浏览器请求)

<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"> &lt;?php /** *封装cURL的调用接口,get的请求方式。 */ functiondoCurlGetRequest($url,$data=[],$header=[],$timeout=5){ if($url==&quot;&quot;||$timeout&lt;=0){ returnfalse; } $url=$url.&#39;?&#39;.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); } ?&gt;</pre><p>使用样例:</p><pre class="brush:php;toolbar:false"> &lt;?php $url=&quot;https://a.wunderlist.com/api/v1/tasks&quot;; $data=array(&#39;list_id&#39;=&gt;&#39;2669071&#39;); $header[]=&quot;X-Client-ID:7e43c50781295f355&quot;; $header[]=&quot;X-Access-Token:4dc049e83308fe6c66ee08a1833577f90298bcec3dca66cc1d20&quot;; echodoCurlGetRequest($url,$data,$header); ?&gt;</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"> &lt;?php /** **封装cURL的调用接口,post的请求方式。 **/ functiondoCurlPostRequest($url,$data=[],$header=[],$timeout=5){ if($url==&#39;&#39;||$timeout&lt;=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); } ?&gt;</pre><p>使用样例:</p><pre class="brush:php;toolbar:false"> &lt;?php $url=&quot;http://www.hangge.com/post.php&quot;; $data=array(&#39;list_id&#39;=&gt;&#39;2669071&#39;,&#39;user_id&#39;=&gt;&#39;123456&#39;); $header[]=&quot;X-Client-ID:7e43c50781295f35&quot;; $header[]=&quot;X-Access-Token:4dc049e83308fe6c66ee08a1833577f90298bcec3dca66cc1d202&quot;; echodoCurlPostRequest($url,$data,$header); ?&gt;</pre><p>post.php 中接收参数相关代码:</p><pre class="brush:php;toolbar:false"> &lt;?php echo$_POST[&quot;list_id&quot;]; echo$_POST[&quot;user_id&quot;]; ?&gt;</pre><p>5,使用cURL发送POST请求(raw形式提交数据)</p><p>对上面的 POST 封装方法做个小修改,参数中的发送数据格式改成字符串。</p><pre class="brush:php;toolbar:false"> &lt;?php /** **封装cURL的调用接口,post的请求方式。 **/ functiondoCurlPostRequest($url,$requestString=&quot;&quot;,$header=[],$timeout=5){ if($url==&#39;&#39;||$timeout&lt;=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); } ?&gt;</pre><p>使用样例,这里以 raw 数据的形式提交一个 json 串:</p><pre class="brush:php;toolbar:false"> &lt;?php $url=&quot;http://www.hangge.com/post.php&quot;; $data=&#39;{ &quot;list_id&quot;:2669071, &quot;title&quot;:&quot;hangge.com&quot; }&#39;; $header[]=&quot;X-Client-ID:7e43c50781295f35&quot;; $header[]=&quot;X-Access-Token:4dc049e83308fe6c66ee08a1833577f90298bcec3dca66cc1d20&quot;; $header[]=&quot;Content-Type:application/json&quot;;//数据是raw形式的json格式数据 echodoCurlPostRequest($url,$data,$header); ?&gt;</pre><p>post.php 中这么接收数据:</p><pre class="brush:php;toolbar:false"> &lt;?php echofile_get_contents(&quot;php://input&quot;); ?&gt;</pre><p>6,获取cURL请求输出的相关信息</p><p>前面的样例中,我们执行完 curl_exec() 函数后就把服务器返回的信息打印出来。其实在 curl_exec() 执行后还可以使用 curl_getinfo() 函数获取 CURL 请求输出的相关信息。</p><p>比如这里对前面 GET 请求样例做个修改,返回请求信息。将请求 url、请求时间给打印出来。</p><pre class="brush:php;toolbar:false">&lt;?php /** *封装cURL的调用接口,get的请求方式。 */ functiondoCurlGetRequest($url,$data=[],$header=[],$timeout=5){ if($url==&quot;&quot;||$timeout&lt;=0){ returnfalse; } $url=$url.&#39;?&#39;.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=&quot;https://a.wunderlist.com/api/v1/tasks&quot;; $data=array(&#39;list_id&#39;=&gt;&#39;267128407&#39;); $header[]=&quot;X-Client-ID:7e43c50781295f3&quot;; $header[]=&quot;X-Access-Token:4dc049e83308fe6c66ee08a1833577f90298bcec3dca66cc1d20&quot;; $info=doCurlGetRequest($url,$data,$header); echo&#39;URL:&#39;.$info[&#39;url&#39;].&#39;&lt;br&gt;耗时:&#39;.$info[&#39;total_time&#39;].&#39;秒&#39;; ?&gt;</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>
RangeTime:0.006896s
RangeMem:211.54 KB
返回顶部 留言