php curl请求信息和返回信息设置代码实例

5年以前  |  阅读数:1045 次  |  编程语言:PHP 

在用curl抓取网页内容的时候,经常要知道,网页返回的请求头信息,和请求的相关信息,特别是在请求过程中存在重定向的时候获取请求返回头信息对分析请求内容很有帮助

下面就是一个请求中存在重定向的例子,我们的目的是要获取最终实际请求的url地址


    $url='http://www.appchina.com/market/r/489267/com.appshare.android.ilisten.vapk?c=aplus.direct&uid;=gAJ9cQEu1TlyZxsXN-aB4RaanvFL6t6Bj-vj0rIBs&p;=aplus.detail&m;=redirect'; 

    $ch=curl_init(); 
    curl_setopt($ch, CURLOPT_URL, $url); 
    //curl_setopt($ch, CURLOPT_POST, 1); 
    //curl_setopt($ch, CURLOPT_POSTFIELDS, $params); 
    curl_setopt($ch, CURLOPT_HEADER, 1);//返回response头部信息 
    curl_setopt($ch, CURLOPT_NOBODY, 1);//不返回response body内容 
    //curl_setopt($ch, CURLOPT_MAXREDIRS, 1);//设置请求最多重定向的次数 
    curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);//不直接输出response 
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION,1);//如果返回的response 头部中存在Location值,就会递归请求 
    $content=curl_exec($ch); 
    $rinfo=curl_getinfo($ch); 

    echo $content,"</br>"; 
    echo "<hr>"; 
    print_r($rinfo); 

下面是输出的结果


    HTTP/1.1 200 OKServer: nginxDate: Sat, 22 Dec 2012 06:17:44 GMTContent-Type: application/vnd.android.package-archiveConnection: closeLast-Modified: Mon, 03 Dec 2012 16:00:00 GMTExpires: Tue, 03 Dec 2013 16:00:00 GMTCache-Control: max-age=31536000Content-Length: 2142149
    Array( [url] => http://www.d.appchina.com/McDonald/r/489267/com.appshare.android.ilisten.vapk?c=aplus.direct&uid;=gAJ9cQEu1TlyZxsXN-aB4RaanvFL6t6Bj-vj0rIBs&p;=aplus.detail&m;=redirect [content_type] => application/vnd.android.package-archive [http_code] => 200 [header_size] => 289 [request_size] => 196 [filetime] => -1 [ssl_verify_result] => 0 [redirect_count] => 0 [total_time] => 0.171621 [namelookup_time] => 0.135256 [connect_time] => 0.152913 [pretransfer_time] => 0.152916 [size_upload] => 0 [size_download] => 0 [speed_download] => 0 [speed_upload] => 0 [download_content_length] => 2142149 [upload_content_length] => 0 [starttransfer_time] => 0.171582 [redirect_time] => 0 [certinfo] => Array ( )) 

可以看到,经过递归请求后最终得到一个200的response,但是这中方式不能得到最后一次请求的url,也就是最终实际请求的url,要想得到这个url就需要递归的分析每次请求返回的response

下面是我写的一个获取最后一次请求url的递归函数


    $url='http://www.appchina.com/market/r/489267/com.appshare.android.ilisten.vapk?c=aplus.direct&uid;=gAJ9cQEu1TlyZxsXN-aB4RaanvFL6t6Bj-vj0rIBs&p;=aplus.detail&m;=redirect'; 
    [php] view plaincopy
    $realUrl=getRedirectLocation($url); 

    echo "</br>--->",$realUrl; 

    function getRedirectLocation($url){ 

      $realUrl=$url; 
      echo $url,"</br>"; 
      $ch=curl_init(); 
      curl_setopt($ch, CURLOPT_URL, $url); 
      curl_setopt($ch, CURLOPT_HEADER, 1);curl_setopt($ch, CURLOPT_TIMEOUT, 3);//设置curl执行时间不超过3秒 
      //curl_setopt($ch, CURLOPT_NOBODY, 1);//这行不能要,如果添上,那么在遇到302重定向的时候就会得不到真正的请求url 
      curl_setopt($ch,CURLOPT_RETURNTRANSFER,1); 
      $content=curl_exec($ch); 
      //echo $content; 
      $rinfo=curl_getinfo($ch); 
      $matches=array(); 
      if(preg_match('/Location:\s+?(.+?)\s+?/', $content,$matches)){ 
        //echo $matches[1],"</br>"; 
        unset($content); 
        $realUrl=getRedirectLocation($matches[1]); 
      } 
      if(isset($content)){ 
        unset($content); 
      } 
      return $realUrl; 
    } 
 相关文章:
PHP分页显示制作详细讲解
SSH 登录失败:Host key verification failed
获取IMSI
将二进制数据转为16进制以便显示
获取IMEI
文件下载
贪吃蛇
双位运算符
PHP自定义函数获取搜索引擎来源关键字的方法
Java生成UUID
发送邮件
年的日历图
提取后缀名
在Zeus Web Server中安装PHP语言支持
让你成为最历害的git提交人
Yii2汉字转拼音类的实例代码
再谈PHP中单双引号的区别详解
指定应用ID以获取对应的应用名称
Python 2与Python 3版本和编码的对比
php封装的page分页类完整实例