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 相关文章推荐
smarty 原来也不过如此~~呵呵
Nov 25 PHP
[转帖]PHP世纪万年历
Dec 06 PHP
使用Xdebug调试和优化PHP程序之[1]
Apr 17 PHP
PHP 基于文件头的文件类型验证类函数
May 01 PHP
php实现在线生成条形码示例分享(条形码生成器)
Dec 30 PHP
php的一个简单加密解密代码
Jan 14 PHP
php简单获取复选框值的方法
May 11 PHP
PHP判断JSON对象是否存在的方法(推荐)
Jul 06 PHP
php使用include 和require引入文件的区别
Feb 16 PHP
PHP实现自动发送邮件功能代码(qq 邮箱)
Aug 18 PHP
PHP PDOStatement::bindValue讲解
Jan 30 PHP
laravel 自定义常量的两种方案
Oct 14 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
PHP6 mysql连接方式说明
2009/02/09 PHP
php cout&amp;lt;&amp;lt;的一点看法
2010/01/24 PHP
PHP中实现汉字转区位码应用源码实例解析
2010/06/14 PHP
php 伪静态之IIS篇
2014/06/02 PHP
PHP获取页面执行时间的方法(推荐)
2016/12/10 PHP
几个高效,简洁的字符处理函数
2007/04/12 Javascript
JavaScript中的Location地址对象
2008/01/16 Javascript
JS判定是否原生方法
2013/07/22 Javascript
js实现遮罩层划出效果是生成div而不是显示
2014/07/29 Javascript
jQuery添加删除DOM元素方法详解
2016/01/18 Javascript
bootstrap和jQuery.Gantt的css冲突 如何解决
2016/05/29 Javascript
详解http访问解析流程原理
2017/10/18 Javascript
jQuery中each方法的使用详解
2018/03/18 jQuery
Vue.js最佳实践(五招助你成为vuejs大师)
2018/05/04 Javascript
AngularJS标签页tab选项卡切换功能经典实例详解
2018/05/16 Javascript
Javascript操作select控件代码实例
2020/02/14 Javascript
vue-router 控制路由权限的实现
2020/09/24 Javascript
结合Python的SimpleHTTPServer源码来解析socket通信
2016/06/27 Python
PyQt 线程类 QThread使用详解
2017/07/16 Python
Python2和Python3中print的用法示例总结
2017/10/25 Python
python简单实例训练(21~30)
2017/11/15 Python
在Python中pandas.DataFrame重置索引名称的实例
2018/11/06 Python
在python中使用with打开多个文件的方法
2019/01/07 Python
opencv python统计及绘制直方图的方法
2019/01/21 Python
为什么你还不懂得怎么使用Python协程
2019/05/13 Python
Pyqt清空某一个QTreeewidgetItem下的所有分支方法
2019/06/17 Python
对Python3中列表乘以某一个数的示例详解
2019/07/20 Python
python实现的登录与提交表单数据功能示例
2019/09/25 Python
使用Python刷淘宝喵币(低阶入门版)
2019/10/30 Python
python程序文件扩展名知识点详解
2020/02/27 Python
查看keras各种网络结构各层的名字方式
2020/06/11 Python
pandas统计重复值次数的方法实现
2021/02/20 Python
美国顶级防滑鞋:Shoes For Crews
2017/03/27 全球购物
《世界多美呀》教学反思
2014/03/02 职场文书
放飞梦想演讲稿
2014/05/05 职场文书
SQL基础查询和LINQ集成化查询
2022/01/18 MySQL