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 相关文章推荐
Memcache 在PHP中的使用技巧
Feb 08 PHP
PHP 解决utf-8和gb2312编码转换问题
Mar 18 PHP
Symfony2之session与cookie用法小结
Mar 18 PHP
php提交过来的数据生成为txt文件
Apr 28 PHP
Joomla使用Apache重写模式的方法
May 04 PHP
php+flash+jQuery多图片上传源码分享
Jul 27 PHP
PHP自定义多进制的方法
Nov 03 PHP
PHP实现的折半查找算法示例
Dec 19 PHP
PHP排序算法之希尔排序(Shell Sort)实例分析
Apr 20 PHP
PHP中quotemeta()函数的用法讲解
Apr 04 PHP
php简单计算权重的方法示例【适合抽奖类应用】
Jun 10 PHP
thinkphp5.1框架容器与依赖注入实例分析
Jul 23 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
php 表单数据的获取代码
2009/03/10 PHP
php使用include 和require引入文件的区别
2017/02/16 PHP
js 匿名调用实现代码
2009/06/19 Javascript
Javascript select下拉框操作常用方法
2009/11/09 Javascript
jquery 1.4.2发布!主要是性能与API
2010/02/25 Javascript
基于jquery css3实现点击动画弹出表单源码特效
2015/08/31 Javascript
jQuery插件实现图片轮播特效
2016/06/16 Javascript
简单实现js选项卡切换效果
2017/02/09 Javascript
js仿新浪微博消息发布功能
2017/02/17 Javascript
JS实现手写parseInt的方法示例
2017/09/24 Javascript
Angular之toDoList的实现代码示例
2017/12/02 Javascript
深入理解JavaScript的async/await
2018/08/05 Javascript
bootstrap 路径导航 分页 进度条的实例代码
2018/08/06 Javascript
Angular ui-roter 和AngularJS 通过 ocLazyLoad 实现动态(懒)加载模块和依赖
2018/11/25 Javascript
js+springMVC 提交数组数据到后台的实例
2019/09/21 Javascript
js实现拾色器插件(ColorPicker)
2020/05/21 Javascript
[04:26]2014DOTA2国际邀请赛-Newbee顺利进入胜者组决赛 独家专访战神7
2014/07/19 DOTA
Python open读写文件实现脚本
2008/09/06 Python
Python新手实现2048小游戏
2015/03/31 Python
解析Python中while true的使用
2015/10/13 Python
Python内建函数之raw_input()与input()代码解析
2017/10/26 Python
Empty test suite.(PyCharm程序运行错误的解决方法)
2018/11/30 Python
使用Python实现跳帧截取视频帧
2019/05/31 Python
python 判断三个数字中的最大值实例代码
2019/07/24 Python
用Python画一个LinkinPark的logo代码实例
2019/09/10 Python
Python定时器线程池原理详解
2020/02/26 Python
python和JavaScript哪个容易上手
2020/06/23 Python
2014年测量员工作总结
2014/12/12 职场文书
不尊敬老师的检讨书
2014/12/21 职场文书
给老婆的检讨书
2015/01/27 职场文书
Oracle创建只读账号的详细步骤
2021/06/07 Oracle
MySQL连表查询分组去重的实现示例
2021/07/01 MySQL
Redis 的查询很快的原因解析及Redis 如何保证查询的高效
2022/03/16 Redis
PostgreSQL聚合函数介绍以及分组和排序
2022/04/12 PostgreSQL
Win11跳过联网界面创建本地管理账户的3种方法
2022/04/20 数码科技
浅谈Redis缓冲区机制
2022/06/05 Redis