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


Posted in PHP onApril 27, 2015

在用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 相关文章推荐
Windows下的PHP5.0安装配制详解
Sep 05 PHP
[转帖]PHP世纪万年历
Dec 06 PHP
php5 apache 2.2 webservice 创建与配置(java)
Jan 27 PHP
php fsockopen解决办法 php实现多线程
Jan 20 PHP
Yii学习总结之数据访问对象 (DAO)
Feb 22 PHP
php中mysql连接方式PDO使用详解
Feb 25 PHP
php支持中文字符串分割的函数
May 28 PHP
PHP如何通过传引用的思想实现无限分类(代码简单)
Oct 13 PHP
PHP如何实现跨域
May 30 PHP
[原创]php使用strpos判断字符串中数字类型子字符串出错的解决方法
Apr 01 PHP
PHP的PDO事务与自动提交
Jan 24 PHP
用php实现分页效果的示例代码
Dec 10 PHP
PHP rsa加密解密使用方法
Apr 27 #PHP
PHP、Java des加密解密实例
Apr 27 #PHP
PHP永久登录、记住我功能实现方法和安全做法
Apr 27 #PHP
php curl 获取https请求的2种方法
Apr 27 #PHP
PHP curl伪造IP地址和header信息代码实例
Apr 27 #PHP
JavaScript实现滚动栏效果的方法
Apr 27 #PHP
php curl 上传文件代码实例
Apr 27 #PHP
You might like
用户的详细注册和判断
2006/10/09 PHP
php中批量删除Mysql中相同前缀的数据表的代码
2011/07/01 PHP
php&amp;mysql 日期操作小记
2012/02/27 PHP
解析php如何将日志写进syslog
2013/06/28 PHP
实用的简单PHP分页集合包括使用方法
2013/10/21 PHP
PHP使用imagick读取PDF生成png缩略图的两种方法
2014/03/20 PHP
Yii2创建表单(ActiveForm)方法详解
2016/07/23 PHP
表单验证的完整应用案例探讨
2013/03/29 Javascript
jQuery实现数秒后自动提交form的方法
2015/03/05 Javascript
jQuery实现的类似淘宝网站搜索框样式代码分享
2015/08/24 Javascript
JQuery标签页效果的两个实例讲解(4)
2015/09/17 Javascript
js HTML5 Ajax实现文件上传进度条功能
2016/02/13 Javascript
html+js+highcharts绘制圆饼图表的简单实例
2016/08/04 Javascript
Vue.js动态组件解析
2016/09/09 Javascript
基于jquery实现的银行卡号每隔4位自动插入空格的实现代码
2016/11/22 Javascript
微信小程序实现皮肤功能(夜间模式)
2017/06/18 Javascript
nodejs构建本地web测试服务器 如何解决访问静态资源问题
2017/07/14 NodeJs
微信小程序引用iconfont图标的方法
2018/10/22 Javascript
vue-mugen-scroll组件实现pc端滚动刷新
2019/08/16 Javascript
详解vue-router的Import异步加载模块问题的解决方案
2020/05/13 Javascript
Python 自动安装 Rising 杀毒软件
2009/04/24 Python
python调用cmd复制文件代码分享
2013/12/27 Python
Python使用Flask框架获取当前查询参数的方法
2015/03/21 Python
Python的Django框架中的表单处理示例
2015/07/17 Python
详解python之多进程和进程池(Processing库)
2017/06/09 Python
Python实现导出数据生成excel报表的方法示例
2017/07/12 Python
Python3如何在服务器打印资产信息
2020/08/27 Python
python 实现压缩和解压缩的示例
2020/09/22 Python
Python读写csv文件流程及异常解决
2020/10/20 Python
Java中的类包括什么内容?设计时要注意哪些方面
2012/05/23 面试题
实习生自我鉴定
2013/12/12 职场文书
2015教师个人德育工作总结
2015/07/22 职场文书
酒吧七夕情人节宣传语
2015/11/24 职场文书
2016党性教育学习心得体会
2016/01/21 职场文书
Canvas三种动态画圆实现方法说明(小结)
2021/04/16 Javascript
如何理解Vue简单状态管理之store模式
2021/05/15 Vue.js