PHP的HTTP客户端 Leaps/HttpClient

Apache
PHP
跨平台
2015-01-31
灵魂架构师

HttpClient 通过HTTP/HTTPS协议获取数据

安装

"require" : { 
"php" : ">=5.4.0", 
"leaps/httpclient": "1.3.4" 
}

基本使用

这个组件极易使用:

<?php 
//Create an instance 
$HttpClient = new \Leaps\HttpClient\Adapter\Curl(); 
$response = $HttpClient->get('http://www.baidu.com/'); 
echo $response->getContent();

也可以使用批量获取不同的网页内容:

<?php //Create an instance 
$HttpClient = new \Leaps\HttpClient\Adapter\Curl(); 
$response = $HttpClient->get(['http://www.baidu.com/','http://www.qq.com']); 
echo $response->getContent();

设置User Agent

默认情况下,如果是WEB形式使用的本组件,那么UserAgent是取的用户浏览器的,在cli模式下这个值是PHP版本号。

//Create an instance 
$HttpClient = new \Leaps\HttpClient\Adapter\Curl(); 
$HttpClient->setUserAgent('test'); 
$response = $HttpClient->get('http://www.baidu.com/'); 
echo $response->getContent();

设置cookie内容,$cookie为字符串,多个cookie请用;隔开

//Create an instance 
$HttpClient = new \Leaps\HttpClient\Adapter\Curl(); 
$HttpClientt->setCookies('a=1;b=a;c[0]=1;c[1]=2'); 
$response = $HttpClient->get('http://www.baidu.com/'); 
echo $response->getContent();

设置代理服务器地址

//Create an instance 
$HttpClient = new \Leaps\HttpClient\Adapter\Curl(); 
$HttpClient->setHttpProxy('host','port'); 
$response = $HttpClient->get('http://www.baidu.com/'); 
echo $response->getContent();

设置基本认证的用户名和密码

//Create an instance 
$HttpClient = new \Leaps\HttpClient\Adapter\Curl(); 
$HttpClient->setAuthorization('username','password'); 
$response = $HttpClient->get('http://www.baidu.com/'); 
echo $response->getContent();

设置引用页

//Create an instance 
$HttpClient = new \Leaps\HttpClient\Adapter\Curl(); 
$HttpClientt->setReferer('http://www.test.com/'); 
$response = $HttpClient->get('http://www.baidu.com/'); 
echo $response->getContent();

设置请求的服务器的IP,这样可避免请求域名时DNS解析

//Create an instance 
$HttpClient = new \Leaps\HttpClient\Adapter\Curl(); 
// 这样设置请求页面并不会通过DNS解析获取百度服务器的数据,而是直接请求127.0.0.1(即本机)的服务器的数据 
$HttpClientt->setHostIp('127.0.0.1'); 
$response = $HttpClient->get('http://www.baidu.com/'); 
echo $response->getContent();

设置并发请求时最大列队数量,系统默认为100。

HttpClient是支持并发请求的,详细可查看下面的get()方法。如果同时请求一个服务器,在一瞬间会对被请求服务器造成巨大压力,也会对本服务器增加网络IO压力, 所以这个参数可以控制同时并发的数量上限,当达到上限后,列队将等待执行完毕一个追加一个插入列队。

//Create an instance 
$HttpClient = new \Leaps\HttpClient\Adapter\Curl(); 
$HttpClientt->setMultiMaxNum(100); 
$response = $HttpClient->get(['http://www.baidu.com/']); 
echo $response->getContent();

设置其它参数

用以弥补HttpClient类中不存在的方法,具体请看具体驱动的方法,比如采用CURL的话,其实就相当于CURL的setOption()方法

//Create an instance 
$HttpClient = new \Leaps\HttpClient\Adapter\Curl(); 
$HttpClientt->setOption(CURLOPT_TIMEOUT,30); 
$response = $HttpClient->get('http://www.baidu.com/'); 
echo $response->getContent();

get请求

用GET方法请求一个(或多个)页面,这样可以大大缩短API请求时间,并可以设置超时时间,单位:秒 支持并发进程请求,并发请求的特点:比如需要同时请求100个页面,传统的是一个一个载入,假设每个页面需要0.1秒,那么100个页面就需要耗时10秒,而通过并发的方式,100个页面理论上也就是0.1秒就可以同时载入完成了,效率非常高。

单个URL直接返回请求的内容的对象,多个URL则返回以URL为key的数组


//Create an instance 
$HttpClient = new \Leaps\HttpClient\Adapter\Curl(); 
// 请求单个页面 
echo $HttpClient->get('http://www.baidu.com/',3)->getContent();  
// 请求多个页面 
$urls = array (  
'http://www.baidu.com/',  'http://www.google.com/',      'http://www.sina.com.cn/test.html'); 
// 返回已url为key的数组,注意,前后顺序有可能跟$urls中的不一样 print_r($HttpClient->get($urls));

post请求

用POST方法提交数据,支持多个页面同时请求 // 请求单个页面

高级响应(Response)

$HttpClient = new \Leaps\HttpClient\Adapter\Curl(); 
$response = $HttpClient->get('http://www.baidu.com/');  
//获取响应的文档类型 
echo $response->getContentType();  
//获取响应的文档编码(当响应头和返回的HTML文档中没有编码信息时该方法获取不到正确的编码) 
echo $response->getCharSet();  
//获取响应的文档后缀名,(根据响应的文档类型来匹配后缀名,方便在下载文档后另存) echo $response->getContentSuffix();  
//获取响应的状态码(如200) 
echo $response->getStatusCode();  
//获取原始的响应头 
echo $response->getRawHeader();  
//获取解析过的响应头Key->value形式 
echo $response->getHeaders();  
//获取指定响应头 
echo $response->getHeader($name);  
//获取解析过的Cookie集合,数组形式 
echo $response->getCookies();  
//获取指定的Cookie值 
echo $response->getCookie($name);  
//获取本次请求消耗的时间 
echo $response->getTime()  
//获取响应的内容 
echo $response->getContent();  
//获取HTML文档Head中的title和meta标签数组 
echo $response->getHeadTags();  
//是否是有效的HTTP响应码 
echo $response->isInvalid();  
//是否是成功的响应(响应码为200-300之间视为成功) 
echo $response->isSuccessful();  
//是否是重定向响应(300-400) 
echo $response->isRedirection();  
//是否是客户端错误的响应(400-500) 
echo $response->isClientError();  
//是否是服务端错误的响应(500-600) 
echo $response->isServerError();  
//是否是200 
echo $response->isOk();  
//是否是403 
echo $response->isForbidden();  
//是否是404 
echo $response->isNotFound();  
//是否是201,04,304 
echo $response->isEmpty();
加载中

评论(3)

逝影落枫
逝影落枫
兼容的php环境一定要大于5.4? #Leaps/HttpClient#
rihgtzhao
rihgtzhao
怎么安装?不太明白呀~ #Leaps/HttpClient#
海诺者
海诺者
问个问题,模拟登录使用话兼容吗? Leaps/HttpClient

Leaps/HttpClient 1.4.2 发布,PHP 的 HTTP 客户端

Leaps/HttpClient 1.4.2 发布,本次升级如下: 1、修复Curl模块在发送POST请求时不支持多维数组的问题 Leaps/HttpClient 是一个 PHP 语言写的“多线程" Http 客户端,支持 HTTP/HTTPS 抓取数...

2015/05/14 08:58

Leaps/HttpClient 1.3.6 发布,PHP HTTP 客户端

Leaps/HttpClient 1.3.6发布,本次升级如下: 1、增加响应中编码的严格判断,防止个别情况下判断失败的问题。 2、完善程序说明文档。 Leaps/HttpClient 是一个 PHP 语言写的“多线程" Http ...

2015/04/27 09:06

Leaps/HttpClient 1.3.4 发布,PHP 的 HTTP 客户端

Leaps/HttpClient 1.3.2发布,本次升级如下: 1、增加单元测试,并全都测试通过。 2、增加基本的HTTP认证登陆 3、增加代理Http服务器。抓数据被封IP再也不怕了。 4、修复CURL上传的问题,PHP...

2015/04/15 10:44

Leaps/HttpClient 1.3.2 发布,PHP 的 HTTP 客户端

Leaps/HttpClient 1.3.2发布,本次升级如下: 1、在获取响应内容时增加获取原始响应头的功能。 2、增加各种IsXXX方法来判断响应状态。 3、自动解析响应头。 4、解析响应的内容类型和编码。 ...

2015/04/13 19:36

Leaps/HttpClient 1.2.4 发布,PHP 的 HTTP 客户端

Leaps/HttpClient 更新到1.2.4, Leaps/HttpClient 是一个PHP语言写的“多线程"Http客户端,支持HTTP/HTTPS抓取数据,默认使用Curl多线程获取数据,在不支持Curl的情况下自动使用socket在发起...

2015/03/21 17:38

没有更多内容

加载失败,请刷新页面

没有更多内容

2
回答
Leaps/HttpClient可以抓取Https的网站吗?
灵魂架构师 的回答 2015/04/27 17:25
最佳答案
当然可以,Leaps/HttpClient默认支持HTTP和HTTPS。并且可以抓取301、302跳转后的内容!

没有更多内容

加载失败,请刷新页面

没有更多内容

HttpClient 4.3教程 第六章 HTTP缓存

HttpClient 4.3教程 第六章 HTTP缓存 6.1.基本概念 HttpClient的缓存机制提供一个与HTTP/1.1标准兼容的缓存层 - 相当于Java的浏览器缓存。HttpClient缓存机制的实现遵循责任链(Chain of Re...

2013/10/28 13:23
133
0
Android 浅谈HttpClient工具类

在 Android开发中我们经常会用到网络连接功能与服务器进行数据的交互,为此Android的SDK提供了Apache的 HttpClient来方便我们使用各种Http服务。你可以把 HttpClient想象成一个浏览器,通过它...

2013/07/25 14:54
695
0
httpClient学习

简单学习下httpclient,摘自官方文档

2015/05/13 11:33
122
0
HttpComponents

Commons HttpClient HttpClient HttpComponents 的关系是 旧的httpclient是属于Commons HttpClient项目的,不过此项目已不再更新,也就是httpclient3以前. 之后httpcore,httpclient,httpasync...

2013/12/14 22:50
123
1
[017] Android平台HttpClient的使用-手机号码归属地查询

Android平台主要提供了四种数据存储方式:Shared Preferences、文件存储、Sqlite存储和网络存储。其中: 1)Shared Preferences 一个轻量级的键-值存储机制,专门用于存储键-值对数据,并且仅...

2014/06/10 19:40
18
0
Apache HttpClient 资源释放、请求超时,导致线程池用光、内存不足

Apache HttpClient,据说很强大,可以支持峰值一秒7万以上的请求。不过需要注意一些资源释放和超时处理的问题。 问题1:线程资源无法释放,最终导致内存不足、或线程池被用光。 问题代码: ...

10/17 09:04
69
0
HttpClient与HttpComponents

HttpClient HttpClient 是 Apache Jakarta Common 下的子项目,可以用来提供支持 HTTP 协议的客户端编程工具包 HttpClient: http://hc.apache.org/httpclient-3.x/ HttpClient入门: http:/...

2013/01/21 17:51
1K
1
今天被这么问题搞的头晕 no SOAPAction header!

错误信息: ns1:Client.NoSOAPAction no SOAPAction header! eroad-PC httpClient 调用webservice 错误 问题分析 wsdl soapAction 为空通过httpClient 调用的失败 只需在httpHeard 增加 head...

2015/07/31 16:16
183
0

没有更多内容

加载失败,请刷新页面

返回顶部
顶部