A-A+

Guzzle,优秀的HTTP处理类库

2018年06月01日 10:38 汪洋大海 暂无评论 阅读 100 views 次

Guzzle 基本信息

类库简介

Guzzle is a PHP HTTP client that makes it easy to send HTTP requests and trivial to integrate with web services.

guzzle 是一个PHP HTTP客户端,能够更容易的发送HTTP请求,并且可以轻松的与web服务集成。

你可以将 guzzle 理解成 “没有界面的浏览器”,它可以实现获取网站HTML内容、登录网站、上传文件等行为,但是整个操作的过程不是键盘+鼠标,而是通过编程去实现。

PS:guzzle 支持发起异步请求和多线程请求。

下载地址

composer composer require guzzlehttp/guzzle

github https://github.com/guzzle/guzzle

运行环境

最新版本 6.3.0 需要 php5.5以上的版本。

如果使用 stream 相关功能,需要在php.ini中打开 allow_url_fopen

如果需要使用 curl 相关功能,也必须启用 curl(7.19.4)和zlib,完美处理https还需要 OpenSSL。

提醒:如果未安装 curl,guzzle 将使用 PHP stream 发送请求,你还可以自定义其他的HTTP的处理程序。

开发文档

官方文档:http://docs.guzzlephp.org/en/stable/

中文文档:http://guzzle-cn.readthedocs.io/zh_CN/latest/

基础用法

这是最基本的需求,发起请求,并且获取响应内容,将GET切换为POST即可发起POST请求。

$client = new GuzzleHttp\Client();

$res = $client->request(
    'GET',
    'http://127.0.0.1'
);

//获取HTTP状态码
var_dump($res->getStatusCode());

//获取响应头
var_dump($res->getHeader('content-type'));

//获取响应内容
echo $res->getBody();

通过GET发送数据

$res = $client->request(
    'GET',
    'http://127.0.0.1/php library/gpc.php',
    [
        'query'=>['a'=>1]
    ]
);

通过POST发送数据

$res = $client->request(
    'POST',
    'http://127.0.0.1/php library/gpc.php',
    [
        'form_params'=>['a'=>1]
    ]
);

上传文件

//读取待上传的文件
$contents = fopen('./20171204-guzzle.php', 'r');
$body = [
    //上传文件
    [
        'name' => 'a',
        'contents' => $contents,
    ],
    //普通表单
    [
        'name' => 'b',
        'contents' => 1,
    ]
];
$res = $client->request(
    'POST', 
    'http://127.0.0.1/php library/gpc.php', 
    ['multipart'=>$body]
);

携带COOKIE发起请求

这就是传说中的模拟登陆了嘛,可以使用PHP去模拟登陆目标网站,然后去实现一些不可告人的目的。

$cookieJar = GuzzleHttp\Cookie\CookieJar::fromArray([
    'cookie_name' => 'cookie_value'
], '127.0.0.1');

$res = $client->request(
    'GET', 
    'http://127.0.0.1/php library/gpc.php', 
    ['cookies' => $cookieJar]
);

玩cookie,需要你对HTTP有更多一点了解,如果你搞不清楚本段代码,就去补课吧。

上面的代码,需要你预先提供COOKIE,当然你也可以配合其他例子,自动抓取COOKIE,自行研究。

异步的玩法

在此之前,我也没有好好阅读过 guzzle 的文档,甚至不知道它支持异步请求。所以,这段内容是现做现卖,如有差异,请大家及时提出。

测试方法

使用for循环,按序生成10次请求。请求目标设置了随机延迟 (sleep(mt_rand(0,2))) 秒。

如果是同步请求:会按序生成结果。总耗时 = 10次请求的 总延迟秒数。

如果是异步请求:会打乱循环顺序,优先输出延迟低的请求。总耗时 = 耗时最长的请求。

测试结果

下面的代码片段,确实实现了异步请求。

请求编号不是0123,而是根据延迟秒数被打乱。

总请求时间是2秒,而非 1+2+2+2+2+2 = 11秒。

请求开始:03:40:04
延迟0,请求编号:0
延迟0,请求编号:4
延迟0,请求编号:5
延迟0,请求编号:6
延迟1,请求编号:1
延迟2,请求编号:2
延迟2,请求编号:3
延迟2,请求编号:7
延迟2,请求编号:8
延迟2,请求编号:9
请求结束:03:40:06

相关代码

$promise = [];

$client = new GuzzleHttp\Client();

echo 'start' . date("Y-m-d H:i:s");
//生成10个请求
for($i=0;$i<10;$i++){
    $promise[$i] = $client->requestAsync(
        'GET', 
        //请求目标(记录了请求时间)
        'http://127.0.0.1/php library/gpc.php?a='.$i
    );
    $promise[$i]->then(
        function (ResponseInterface $res) {
            echo $res->getBody() . "\n";
        },
        function (RequestException $e) {
            echo $e->getMessage() . "\n";
            echo $e->getRequest()->getMethod();
        }
    );

}
//分别调用GuzzleHttp\Promise::wait()方法
foreach( $promise as $obj ){
    $obj->wait();
}
echo 'end' . date("Y-m-d H:i:s");

文章来源:http://www.sodevel.com/course/res/170/634
标签:

给我留言